我正在基于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());
}

07-28 08:26