gpt4 book ai didi

java - 泛型参数,如果 raw 默认为 Object

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:05:38 24 4
gpt4 key购买 nike

我正在开发一个基于 Java 7 的项目。我想在其中一个类上引入一个通用参数,这样我就可以慢慢消除使代码正常工作所需的类转换。

让我们介绍一个与我正在研究的类相似的类:

public class A {
public List<B> getB() { ... }
}

B有很多子类,使用时需要强制转换,显然不理想。我想做的修改是这样的:

public class A<T extends B> {
public List<T> getB() {...}
}

这可以消除某些情况下所需的转换。但是,A 在项目的很大一部分中使用,这使得遍历和重写它使用的每个案例的效率不是很高。

我希望,使用原始 A 类可以使 getB() 返回 B 类型。实际情况是,如果使用 raw,getB() 将返回一种类型的 Object。是一些与 Java 7 相关的行为,还是我忽略了什么?当 A 是原始的时,有没有办法让 getB() 返回 B 类型?我似乎没有在 Java 8 中遇到过这个问题,尽管我也没有真正参与过这种结构不佳的项目。

编辑:在评论中,我被要求提供出现问题的具体代码示例。假设上面的类(稍作编辑以更好地适应我的实际情况):

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 中删除,并且您会从 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());
}

关于java - 泛型参数,如果 raw 默认为 Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56681386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com