Using generic programming in Java like this: class A<B>, why I cannot new a B's object
1 2 3 4 5
| public class A {
public func() {
B b = new B();
}
} |
我从netbeans得到这个错误提示:
1 2 3 4 5
| unexpected type
required : class
found : type parameter B
where Bis a type -variable :
B extends Object declared in class A |
号
我如何才能新建B类对象?
- 共享完整的代码,错误发生在哪一行?编译时间还是执行时间?
- Java中泛型类型的创建实例的可能副本?请参见:我如何在Java中实例化泛型类型?
A中的B只是一个类型参数。不能创建实例化参数。只能创建实际类型的实例。
但您可以声明将该实例作为参数public func(B b)的方法。
我建议您阅读关于泛型的教程。
- 重要的是要意识到这是因为Java中的类型擦除。Java泛型是如何实现的。在运行时,Java B始终是类型对象,但是编译器会自动地在需要的转换中插入。Java做出了向后兼容性的决定。在C等语言中,关于对象B的类型信息被保留。
- 我认为这与字模擦除无关。原因是它不是一个实际的类型(它只是一个类型参数)。例如,使用public class MyComp implements Comparator方法,可以在compare方法中实例化MyObject。
- @bheshgurung它与类型擦除有关。相比之下,在C中(泛型类型被重新定义),您可以执行new T()。
- @不,它不是一个真正的参数,是的,它与类型擦除有关。Jazzepi的评论是正确和有教育意义的。
- PaulBellora:我认为这取决于是否只讲Java或泛泛型。
- @Jo&227;Oferndes:它不能是实际类型。
- "在运行时,Java B总是类型对象"。无论如何,"变量类型"是编译时概念。
- @变量的newacct类型绝对是在运行时存在的,它不仅仅是编译时概念。在运行时,我可以在强制转换之前使用InstanceOf查询对象的类型。
- @Jazzepi:你说的是对象的类,而不是变量的类型。
- @newacct类是类型,由用户定义。所以一个对象的类就是这个对象的类型。当你写一个返回字符串的方法时,你会说"方法返回一个字符串类型的值"
- @Jazzepi:对于每个类,都有一个同名的引用类型。类型仅适用于编译时的表达式和变量。String foo ="bar";和Object baz ="bar";是不同类型的变量。在运行时,没有区别。它们都是指向类String的对象的引用。如果我执行bar = null;,您在运行时看到的只是一个空指针引用。在编译时,我们有一个String类型变量的概念。如果我有char和short,你看到的只是运行时的字节,但我知道它们在编译时是不同的。
由于类型擦除,您不能这样做。请看下面的答案https://stackoverflow.com/a/6810709/860294
原因是B可以是接口或类(甚至是抽象的)。因此,对于接口或抽象类,new b()将无效。因此,这是不允许的。
Java使用类型擦除。它不知道B的类,因此它不知道在运行时,B类最终会不会有一个带有该参数集的构造函数。