Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与泛型和类斗争_Java_Arrays_Generics - Fatal编程技术网

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);
}