public class GenericClass<T> {
class MyClass {
}
public GenericClass(final T[] param) {
MyClass myObject = new MyClass(); // OK
MyClass[] myArray = { new MyClass(), new MyClass() }; // Cannot create a generic array of GenericClass<T>.MyClass
}
}
这不是创建泛型数组。编译器理解/确定MyClass
应该没有问题,不是吗?
涵盖这一点的JLS部分是10.6。具体来说,这是因为:
如果ClassOrInterfaceType不表示可实现类型(4.7),则是一个编译时错误。否则,ClassOrInterfaceType可以命名任何命名的引用类型,甚至是抽象类类型(8.1.1.1)或接口类型(9)。
上述规则意味着数组创建表达式中的元素类型不能是参数化类型,而不是无界通配符。
因为MyClass
是非静态的,所以它依赖于外部类;它实际上是泛型类
奇怪的是如果你这样做。
class MyClass<T> {
}
public GenericClass(final T[] param) {
MyClass[] myArray = { new MyClass(), new MyClass() };
}
这是合法的。有点古怪,有点笨拙,但是合法。因为您重新声明了类型,所以它隐藏了外部的类型。然后...数组和泛型不能混用...除非使用原始类型。为了向后兼容,你可以有一个rawtype数组来保存< code>MyClass
下面是一些其他信息。从链接...
Java数组携带运行时类型信息,标识所包含元素的类型
到编译器,您的代码如下所示:
MyClass[] myArray = {new GenericClass<T>.MyClass(), ..} //T is unknown
内部类“知道”封闭类的哪个实例创建了它们,并且可以访问这个实例的字段/成员。就好像它们有第二个< code>this变量,其类型是封闭类的具体类型(例如< code>GenericClass
为了克服这种困境,您可以使MyClass
静态
。这将使它与封闭类的任何实例完全解耦(也就是说:它不会有第二个this
),因此它们可以自由实例化:
public class GenericClass<T> {
static class MyClass {
}
public GenericClass(final T[] param) {
MyClass myObject = new MyClass(); // OK
MyClass[] myArray = { new MyClass(), new MyClass() };
}
}
问题内容: 我有一个普通班和一个具体班。如何创建类型数组? 我试过: 但是我得到了ClassCastException。 但是,当我尝试时: 效果很好。 问题答案: 使用原始类型创建数组:
问题内容: 我正在使用泛型编写某些东西,令我惊讶的是,我发现这行不通: 那我不能实例化泛型吗?没有任何方法可以做到这一点吗? 问题答案: 是的,这真是令人讨厌。 我使用的解决方法是强制客户端在构造新类时传递类-即 然后您可以使用。
此代码有效。它以“未检查或不安全操作”警告进行编译和运行。 当这两个给我运行时错误时 我遇到的错误如下:
问题内容: 我明白: 由于抽象类本身并不是什么,例如车辆,我们想要创建一个具体实现的对象,例如Car,Bike等。 对象链期间将调用抽象类的构造函数。 我们永远不能直接创建抽象类的对象,即使它包含构造函数并且所有方法都已实现。 但是从编译器的角度来看,Java为什么要强制执行这些规则? 问题答案: 这不是技术限制,而是(如您所指出的)逻辑上的限制。Java(和许多其他语言)执行各种规则不是因为它们
问题内容: 我有一个通用的抽象模板类。我以为如果创建特定于类型的生产者,则可以直接在通用类中注入一些DAO服务。但是我不能。 为什么?我该如何解决? 当我注入一个例如它完美地工作。但是没有泛型… 问题答案: 当您要求 容器知道您要一个类型为的bean 。如果存在这样的bean并且其类型信息已知,则容器可以满足注入。例如,类型信息保留在带注释的方法中 容器使用反射来检索该参数化的类型,并将其与请求的