繁体   English   中英

Java中的数组,列表和泛型

[英]Arrays, List and Generics in Java

为了完全理解Java中的泛型,我遇到了一个我无法解决的问题,也无法在Web上找到特定的解决方案。 我有这种方法:

public <T extends City> void someMethod(List<T[]> objectsList) {
    List<City[]> myList = (List<City[]>) objectsList;
}

只是将其写入到编译器中会给我一个我可以忽略的错误-但是在编译期间,编译器无法显示

Error:(97, 46) error: incompatible types: List<T[]> cannot be converted to List<City[]> where T is a type-variable: T extends City declared in method <T>someMethod(List<T[]>)

一种简单的解决方案是简单地运行接收到的“ objectsList”中的整个List和Array,并一次进行一次类型转换,这是可行的(我尝试过),但是我不确定这是否是正确的方法。 ..

这不是您经常要做的事情(因为泛型和数组不能很好地混合使用),但是有一些重要的事情要注意:

  • T保存该方法的类型信息。 您可能不会一直都经过一个City ,而在您不希望通过的情况下,Java无法帮助您。
  • 由于泛型是不变的,因此强制转换并不安全。 即使T extends City ,也不能说List<City[]>等同于List<T[]>

这样,您可以使用通用类型上绑定的通配符来解决此问题。 在对方法接受的声明以及要存储的内容中使用它们。 然后,您避免进行强制转换,并且所有内容都是类型安全的。

public <T extends City> void someMethod(List<? extends T[]> objectsList) {
    List<? extends T[]> myList =  objectsList;
}

无需强制转换,只需使用T[]类型的数组即可。 例如,这将编译:

public <T extends City> void someMethod(List<T[]> objectsList) {
    for (T[] cities : objectsList) {
        for (City city : cities) {
            // do something with the city object
        }
    }
}

方法中的代码不知道数组中哪个确切的City子类,但是您可以将它们分配给City类型的变量,并将其视为City对象。


您的转换不起作用的原因是由于List<SubType>不是List<Type>的子List<Type>

因为在Java中,数组就像类型。 因此,类型City[]T extends City完全不同,它T extends City我不确定您在说什么,但是List<T[]>看起来非常狡猾。

如何使用泛型

假设您要以相反的顺序返回一个已设置参数的ArrayList 我不知道为什么,并且我希望有一个非常好的库函数可以这样做,但让我们继续吧。

public ArrayList<E> getReversedList(ArrayList<E> list) {
    ArrayList<E> newList = new ArrayList(list.size());

    for (int i = 0; i < list.size(); i++)
        newList.add(list.size() - i, (E) list.get(i));

    return newList;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM