gpt4 book ai didi

Java 泛型 - 这个未经检查的转换安全吗?

转载 作者:搜寻专家 更新时间:2023-10-31 19:41:45 25 4
gpt4 key购买 nike

我有(另一个)未检查的类型转换问题。我 90% 确定它是安全的,但我想确定(我正在向正在审查代码的另一位开发人员证明使用 @SupressWarnings 是合理的)

我们的框架已经设置了以下模式:

abstract class Writer<T> {
Class<T> valueType;

Writer(Class<T> valueType) {
this.valueType = valueType;
}
}
class Cat { }

class CatWriter extends Writer<Cat> {
CatWriter() {
super(Cat.class);
}
}

我也在使用 Writer 的子类编写一个使用泛型的类:

class Color {}
class Green extends Color {}
class Brown extends Color {}

我的 writer 类是这样的:

abstract class Bird<C extends Color> {}
class Parrot extends Bird<Green>{}
class Ostrich extends Bird<Brown>{}

class BirdWriter<C extends Color> extends Writer<Bird<C>> {
BirdWriter(Bird<C> bird) {
super((Class<Bird<C>>)bird.getClass());
}
}

我可以在编写器中使用原始类型,但这会给出更多警告。相反,我将泛型包含在 Writer 类中。除了构造函数之外,这在任何地方都很好。我被迫投下 bird.getClass() (这是一个没有通用签名的类对象)到具有通用签名的类对象这会在转换时产生一个unchecked cast警告,但我相信将结果转换为 Class<Bird<C>> 是安全的因为bird传递给参数的保证是 Bird<C> .

测试支持我的理论,但我想确保我的想法是正确的。 这段代码有什么不安全的地方吗?


更新

感谢您的回答。由于这些答案,我意识到我的结构存在弱点并对其进行了修改。

本质上 Cat使用简单的 Writer知道它总是在写 Cat .就我而言,我有一种可以由动态 Writer 编写的“SmartAnimal”类型,因此我不必创建 Writer对于每个动物。

class SmartAnimal {}
class Dog extends SmartAnimal {}
class Horse extends SmartAnimal {}
class SuperHorse extends Horse {}

class DynamicWriter<A extends SmartAnimal> extends Writer<A> {
DynamicWriter(A smartAnimal) {
super((Class<A>)smartAnimal.getClass());
}
}

再次,我有同样的警告,但这似乎更安全。

这样更好吗,安全吗?

最佳答案

你并不完全正确。正确、安全但仍未经检查的转换是 Class<? extends Bird<C>> ,因为你被传递的鸟可能是一只猫头鹰,它会返回一个 Class<Owl>可以分配给 Class<? extends Bird<C>> . Peter Lawrey 是正确的,因为这是未经检查但安全的。

更新:

不,出于同样的原因,它仍然不安全。你仍然可以做类似 new DynamicWriter<Horse>(new SuperHorse()); 的事情这将执行来自 Class<SuperHorse> 的未经检查的转换至 Class<Horse> .为了安全起见,您需要转换为 Class<? extends A> .

关于Java 泛型 - 这个未经检查的转换安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4810690/

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