向Java接口添加通用默认方法会警告未选中强制转换



我为接口添加了一个泛型方法,这样每个实现该接口的类都有一个流畅的方法来设置该类的参数,但我得到了"未选中的演员阵容"在返回语句上发出警告,所以我正在抑制它。

由于我对仅仅抑制警告感到不舒服,而且自从我从C#来到java以来,强制转换一直感觉像是代码的气味,它们肯定在哪里,我想知道在什么情况下可能会应用该警告。或者,我想知道是否有一种更安全的方式来实现我想要的。

希望能够使用

var model = new MyModel().withBoundsToFit(true);

而不是

var model = new MyModel();
model.setBoundsToFit(true);

我在IBoundsToFit:中创建了这个方法

//@SuppressWarnings("unchecked")
default <T extends IBoundsToFit> T withBoundsToFit(boolean boundsToFit) {
setBoundsToFit(boundsToFit);
return (T) this; // Type safety: Unchecked cast from IboundsToFit to T
}

我不明白的是,当我已经将T约束为扩展IBoundsToFit的类时,在什么情况下进行这种强制转换是不安全的。

问题是,设置泛型返回类型意味着调用者可以决定返回类型,而不是实现类。例如,下面的示例编译,但在运行时失败,并出现ClassCastException。

public class Demo {
public static void main(String[] args) {
A foo = new B().withBounds(false);
}
}
interface Bounds {
void setBounds(boolean bounds);
default <T extends Bounds> T withBounds(boolean bounds) {
this.setBounds(bounds);
return (T) this;
}
}
class A implements Bounds {
public void setBounds(boolean bounds) {}
}
class B implements Bounds {
public void setBounds(boolean bounds) {}
}

相关内容

  • 没有找到相关文章

最新更新