Java 与泛型和类斗争
我总是在与泛型抗争。我不知道为什么这会让我发疯。我有一个老问题,我已经有好几次了Java 与泛型和类斗争,java,arrays,generics,Java,Arrays,Generics,我总是在与泛型抗争。我不知道为什么这会让我发疯。我有一个老问题,我已经有好几次了 class Father { ... } class Child1 extends Father { ... } class Child2 extends Father { ... } public class TestClass { private static Class<? extends Father>[] myNiceClasses = new Class
class Father {
...
}
class Child1 extends Father {
...
}
class Child2 extends Father {
...
}
public class TestClass {
private static Class<? extends Father>[] myNiceClasses = new Class<? extends Father>[] {
Child1.class,
Child2.class
}
}
班长{
...
}
一班的孩子是父亲{
...
}
第二班的孩子是父亲{
...
}
公共类TestClass{
私有静态类[]myNiceClasses=新类[]{
此解决方案并不令人满意,因为您无法如此轻松地进行转换
所以我的问题是:如何解决这个问题?我脑子里的结在哪里?参见quant_dev的链接线程所说的是,不能创建泛型数组,因为它们不能保证类型安全。你可以在数组中得到泛型不允许的东西。我所知道的最干净的方法是:
private static Class<? extends Father>[] myNiceClasses =
(Class<? extends Father>[]) new Class<?>[] {};
私有静态类[]{};
这是因为java不支持泛型数组创建。泛型最适合集合。因此,您可以使用ArrayList解决您的问题:
ArrayList<Class<? extends Father>> myNiceClasses = new ArrayList<Class<? extends Father>>();
myNiceClasses.add(Child1.class);
myNiceClasses.add(Child2.class);
ArrayList泛型和数组是最好避免的组合。编译器不希望您创建泛型数组的事实是Java泛型是语言的附加组件,有时您可以看到连接。另一个例子是异常,您也不能将它们与泛型组合。
我建议在这种情况下避免使用数组。改用泛型列表。这是由于类型擦除。Java编译器在编译过程中擦除所有泛型信息。(这是因为泛型是该语言的后期添加,Sun决定不修改JVM,以实现向后兼容性。这意味着该语言知道泛型,但JVM不知道。)
因为JVM在运行时不知道泛型类型,所以它无法实例化该泛型类型的数组。在您的情况下,它所能做的最好的事情就是实例化原始类型的数组Class
在这种情况下,最好使用完全支持泛型的集合框架
总而言之:泛型和数组不会混合。或者,正如amit.dev所说,您可能需要使用列表。在这种情况下,假设myNiceClasses字段应该是常量,您可以使用以确保列表不会更改:
private static final List<? extends Father> myNiceClasses;
static {
ArrayList<? extends Father> l = new ArrayList<? extends Father>();
l.add(Child1.class);
l.add(Child2.class);
myNiceClasses = Collections.unmodifiableList(l);
}
私有静态最终列表
private static Class<?>[] myNiceClasses = new Class<?>[] {
private static Class<? extends Father>[] myNiceClasses =
(Class<? extends Father>[]) new Class<?>[] {};
ArrayList<Class<? extends Father>> myNiceClasses = new ArrayList<Class<? extends Father>>();
myNiceClasses.add(Child1.class);
myNiceClasses.add(Child2.class);
private static final List<? extends Father> myNiceClasses;
static {
ArrayList<? extends Father> l = new ArrayList<? extends Father>();
l.add(Child1.class);
l.add(Child2.class);
myNiceClasses = Collections.unmodifiableList(l);
}