![](/img/trans.png)
[英]refactoring Java arrays and primitives (double[][]) to Collections and Generics (List<List<Double>>)
[英]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.