我正在基于Java 7的项目上。我想在其中一个类上引入一个通用参数,以便可以慢慢消除使代码正常工作所需的类强制转换。
让我们介绍一个与我正在研究的类相似的类:
public class A {
public List<B> getB() { ... }
}
B
有很多子类,在使用时需要强制转换,这显然不理想。我要进行的修改是这样的:public class A<T extends B> {
public List<T> getB() {...}
}
在某些情况下,这可以消除所需的铸造。但是,
A
在项目的很大一部分中都使用,这使得遍历和重写所使用的每种情况的效率都不太高。我希望使用原始的
A
类可以使getB()
返回B
类型。现实情况是,如果使用原始格式,getB()
将返回一种Object
类型。是与Java 7相关的行为,还是我忽略了某些东西?当getB()
原始时,有没有办法让B
返回A
类型?我似乎没有在Java 8中遇到过这个问题,尽管我也没有真正从事过结构如此差的项目。编辑:在评论中,要求我提供发生问题的具体代码示例。假设以上 class (略作修改以更好地适合我的实际情况):
A a = new A();
for(B b: a.getB()) { // Compiler error, because `getB()` returns a list of `Object`s instead of `B`s.
...
}
A<B> a = new A<B>();
for(B b: a.getB()) { // Everything is fine here obviously
...
}
最佳答案
问题在于,如果您使用原始类型,那么该类型也会从List
中删除,并且会从List
返回原始getB()
类型。由于forEach
循环不允许未经检查的类型转换,因此会出现编译错误。使用raw types are best avoided免责声明,您的情况下一个简单的解决方法是使用临时变量进行类型转换:
A a = new A();
List<B> list = a.getB();
for( B b : list ) {
System.out.println(b);
}
或emulate the enhanced for loop,在这种情况下,循环头中将允许未经检查的类型转换:
for (Iterator<B> i = a.getB().iterator(); i.hasNext();) {
System.out.println(i.next());
}