gpt4 book ai didi

java - 方法类型参数化在 for 循环中不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:08 26 4
gpt4 key购买 nike

我有这种类型:

abstract class ControlGraphic { 
//...
}

class PrecisionControlGraphic extends ControlGraphic {
//...
}

class AccuracyControlGraphic extends ControlGraphic {
//...
}

我有一个返回 List<T> 的方法其中 TPrecisionControlGraphicAccuracyControlGraphic取决于类型参数:

 private <T extends ControlGraphic> List<T> getGraphics() {
List<T> graphics = new LinkedList<T>();
for (ControlGraphic graphic : getGraphicsFromDB())
graphics.add( (T) graphic);
return graphics;
}

下面的代码可以正常工作:

List<PrecisionControlGraphic> precisionGraphics = getGraphics();
for (PrecisionControlGraphic graph : precisionGraphics) { ... }

我想知道为什么另一个没有:

for (PrecisionControlGraphic graph : getGraphics()) { ... }

谢谢。

最佳答案

方法签名说“你可以将 T 设置为 ControlGraphic 的任何子类”,这就是赋值类型检查的原因(因为编译器找到了一个有效的类型 T,实际上该类型取自赋值给变量).

“另一个”(直接循环)不起作用,因为类型 T 可以是 ControlGraphic 的任何子类,不一定是 PrecisionControlGraphic。直接循环不起作用,因为 Java 中的类型检查器不像函数式编程语言那样进行完全推理。 “图形”变量的类型必须按字面意思是“ControlGraphic 的任何子类”才能被接受(这实际上可以通过使类型成为封闭方法的类型参数来安排)。

正如@Adrian Leonhard 所指出的,另一种可能性是注释对 getGraphics 的调用。具有所需的类型:

for (PCG graph : this.<PCG>getGraphics())

但是,基本上,使用这些解决方案中的任何一个,您都在滥用泛型。所有你知道的 getGraphics是你正在处理 ControlGraphic对象,所以该方法应该返回 List<ControlGraphic> ,并且您的代码应该在代码中已知派生类型的地方执行显式转换。

关于java - 方法类型参数化在 for 循环中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29407361/

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