{ public void addObs(O o); public vo-6ren">
gpt4 book ai didi

java - 使用 @SuppressWarnings ("unchecked"转换 Java 泛型是否会导致运行时异常

转载 作者:行者123 更新时间:2023-11-30 11:03:35 25 4
gpt4 key购买 nike

我有 2 个接口(interface) SubObs 如下图所示:

public interface Sub<O extends Obs<? extends Sub>>{
public void addObs(O o);

public void removeObs(O o);

public void notifyObs();
}

public interface Obs<S entends Sub<?>>{
public void update(S s);
}

现在有 2 个以上的具体实现,类 Vie 实现了 Obs 和类 Mod 实现了 Sub如下:

public class Mod implements Sub<Vie<Mod>>{

private Vie<Mod>[] vies = new Vie<Mod>[0];//Here is the error.

public void addObs(Vie<Mod> vie){
vies = addToArray(vies, vie);
//Some other code;
}

public void removeObs(Vie<Mod> vie){
vies = removeFromArray(vies, vie);
//Some other code;
}

public void notifyObs(){
for(Vie<Mod> v : this.vies){
v.update(this);
}
}
}

public class Vie<M extends Mod> implements Obs<M>{

private M mod;

public void update(M){
//some code;
}

public void setMod(M mod){
this.mod.removeObs(this); //Here is the error.
mod.addObs(this); //Here is the error.
this.mod = mod;
}
}

在上面的Mod 代码中,存在数组vies 初始化错误。适用的更正是:

@SuppressWarnings("unchecked")
private Vie<Mod>[] vies = (Vie<Mod>[])new Vie<Mod>[0];

对于 Vie 类的 setMod 方法,可以应用的更正是:

@SuppressWarnings("unchecked")
public void setMod(M mod){
this.mod.removeObs((Vie<Mod>)this);
mod.addObs((Vie<Mod>)this);
this.mod = mod;
}

正如我们所看到的,在上述两种情况下,我们都必须在实例可以被程序使用之前对其进行显式类型转换,我们还必须添加 @SuppressWarnings("unchecked") 以便编译器不会抛出任何编译错误。

现在我对@SuppressWarnings("unchecked")的理解是,我明确要求编译器不要在编译时检查变量实例的类型。如果这是正确的,那么我可以遇到任何运行时 ClassCastException 吗?

也可以修改上面的代码,这样我就不需要任何@SuppressWarnings("unchecked")了吗?

附加信息

我更新了代码以显示变量 vies 的使用情况。以上是观察者模式的基本实现。请注意,就观察者模式而言,这是完整的实现。我的意思是说在实际实现中,真正的类继承了其他类和接口(interface),这里没有提到它们的方法。但就 viesmod 变量而言,这是完整的。

最佳答案

创建参数化类型数组的问题与数组无法像数组通常那样检查添加的元素是否为正确类型有关。由于您只在类内部使用数组而不将其暴露给外部,所以没关系,您可以只抑制警告。您使用的类型和警告的抑制是类的内部实现细节,外部代码不关心。

传递的类型不匹配thisremoves()addObs是一个更大的问题。 Vie<M>Vie<Mod>是不兼容的类型。不清楚你为什么有 Vie是通用的。如果您不将其设为通用,它会起作用:

public class Mod implements Sub<Vie> {

private Vie[] vies = new Vie[0];

public void addObs(Vie vie) {
//vies = addToArray(vies, vie);
//Some other code;
}

public void removeObs(Vie vie) {
//vies = removeFromArray(vies, vie);
//Some other code;
}

public void notifyObs() {
for (Vie v : this.vies) {
v.update(this);
}
}
}

public class Vie implements Obs<Mod> {

private Mod mod;

public void update(Mod mod) {
//some code;
}

public void setMod(Mod mod) {
this.mod.removeObs(this);
mod.addObs(this);
this.mod = mod;
}
}

如果您希望此代码适用于 ModVie子类,那么它会更复杂。

关于java - 使用 @SuppressWarnings ("unchecked"转换 Java 泛型是否会导致运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30296364/

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