gpt4 book ai didi

java - 如何修复不同接口(interface)的泛型中的 "Unchecked cast"

转载 作者:行者123 更新时间:2023-12-02 10:22:39 26 4
gpt4 key购买 nike

未经检查的转换:“zzz.szi.m.Something1”到“T”

运行“mvn package”时收到警告

private <T> T get() throws Exception {
T m;

if (/*some condition*/) {
m = (T)new Something1()
}
elseif (/*some condition*/) {
m = (T)new Something2()
}
else {
m = (T)new Something3()
}
return m;
}

我的类(class):

public class Something1 implements Something {
// ...
}
public class Something2 implements SomethingElse {
// ...
}
public class Something3 implements Something, SomethingElse, SomethingMore {
// ...
}

//添加了对 (T) 的转换,但结果相同

我不想收到任何警告

最佳答案

T 由编译器通过查看该方法的调用上下文来解析。如果调用的结果要赋给类型为XXX的变量,则在编译期间将T替换为XXX以检查逻辑其余的代码。

问题代码打破了这个约定,因为方法代码似乎控制着返回的类型,因此它通常无法在要实例化的类方面做出正确的选择。这就是为什么这个 Actor 不安全。

解决此问题的一种方法是将控制权返回给调用代码。例如,get() 方法可以接受指示要返回的类型的类对象,并使用 Class.newInstance 创建该对象,但必须处理相应的检查异常以及请求的类没有无参数构造函数的可能性:

private <T> T get(Class<? extends T> class) {
try {
return class.newInstance();
} catch (Exception ex) {
// handle the exception apropiately
}
}

调用代码:

Something some;
if (/* condition 1 */) {
some = get(Something1.class);
} else if (/* condition 2 */) {
some = get(Something2.class);
} ...

问题仍然是,您是否在对象实例化之前或之后将与子类无关的通用代码添加到 get 的主体中,以使此方法有值(value),否则您最好简单地调用适当的子类构造函数在每个 if-else 中(即 new Something1()new Something2() 等)。

关于java - 如何修复不同接口(interface)的泛型中的 "Unchecked cast",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54222066/

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