首先,由于java有一个严格的类型系统,在编译时检查程序的类型正确性,在执行前将类加载到字节码验证器时检查程序的字节码。
虽然泛型的引入拓宽了Java类型系统的潜力,但由于Java有子类型,出现了许多问题,如上例所示:
String [] a ={"Hello"};
Object [] b= a;
b[0]= false;
String s=a[0];
System.out.println(s);
在上面的例子中,我们使用String类是Object的子类。我的问题是,是什么原因导致编译器没有产生任何关于上述程序的警告。当我尝试运行它时(当然)抛出一个异常。还有上面的程序在java实现中可能会有什么问题/后果(我的意思是有什么明显的问题吗??)。
Java中的数组是协变的IE。String[]
可以传递给需要Object[]
的对象。这就是编译器不会阻止您将布尔值插入字符串数组的原因。
为了提供协方差,同时也提供运行时保护,Java工程师设计了数组,以便在编译时添加一个标记,用它的类型标记数组。尽管我们可以在编译时添加布尔值,但String[]
上的类型阻止我们在运行时添加布尔值--这就是您在运行代码时可能会遇到的ArrayStoreException
的触发原因。
在Java中,这是在拥有协变数组和抓住向数组中添加错误内容这一步骤之间的一种折衷。这就是为什么一些语言(如Scala)选择不使用协变数组的原因。
创建泛型数组是可能的,但不是直接的,并且有一些类型危险,所以这些方法是针对特定用例的-Josh Bloch的Effective Java讨论了这些。
在数组上使用泛型列表可能更好,因为这样可以在编译时捕获问题。
在下面的代码中,行显示为false。但是当我们再次比较另一个整数包装类时,它返回true。为什么包装器类的比较在第一种情况下是false,而在第二种情况下是true?
如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或
问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符
如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个
我试图创建一个Java方法,它接受一个对象类型和它应该转换成的数据类型。 例如,如果我应该能够返回一个值1作为Int或双根据需要。我使用类传递数据类型作为参数。 问题:如何使方法泛型以接受基于输入参数的返回类型? 下面的代码只是一个示例,它可能在语法上不正确,用于解释我的问题。