【发布时间】:2013-12-01 19:20:41
【问题描述】:
我使用构建器模式和元素和构建器的抽象基类来实现不可变组合。为了减少强制转换的需要并使元素的代码尽可能简洁,我使用泛型创建基类。我收到一个我不明白的警告。请解释为什么显示警告以及如何摆脱它(当然不使用@SuppressWarnings("unchecked"))?
以下是我的代码的相关部分:
abstract public class JElement<J extends JElement<J>> {
abstract protected <B extends AbstractBuilder<J, B>> B newBuilder();
abstract public static class AbstractBuilder<J extends JElement<J>, B extends AbstractBuilder<J, B>> {
public AbstractBuilder() {
}
abstract public J build();
}
}
public class JClass extends JElement<JClass> {
JClass(Builder builder) {
}
@Override
protected Builder newBuilder() {
return new Builder(this);
}
public static class Builder extends JElement.AbstractBuilder<JClass, Builder> {
public Builder(JClass jClass) {
}
@Override
public JClass build() {
return new JClass(this);
}
}
}
警告在 JClass.newBuilder 的返回值处:
类型安全:newBuilder() 的返回类型 JClass.Builder 来自 类型 JClass 需要未经检查的转换以符合 B 类型 JElement
【问题讨论】: