(对不起,双关语)
假设有人想定义一个通用生成器,如下所示:
public abstract class GenericBuilder<T extends Product> {
int x;
int y;
<K extends GenericBuilder<T>> K setX(int x) {
this.x = x;
return (K)this;
}
<K extends GenericBuilder<T>> K setY(int y) {
this.y = y;
return (K) this;
}
abstract T build();
}
abstract class Product {
int x;
int y;
}
class ConcreteProduct extends Product {
int z;
}
class ConcreteBuilder extends GenericBuilder<ConcreteProduct>{
int z;
<K extends GenericBuilder<ConcreteProduct>> K setZ(int z) {
this.z = z;
return (K) this;
}
@Override
ConcreteProduct build() {
ConcreteProduct cp = new ConcreteProduct();
cp.x = x;
cp.y = y;
cp.z = z;
return cp;
}
public static void main(String[] args) {
new ConcreteBuilder().setX(1).setY(2).setZ(3);
}
}
调用ConcreteBuilder.setZ()时,编译期间将失败。
这是为什么?是否应删除?还是说泛型不携带有关其泛型参数的信息?
编辑:
任何想法如何避免在以下情况中使用第二个通用参数:
public class ConcreteBuilder extends GenericBuilder<ConcreteProduct, ConcreteBuilder>
即,看起来有点笨拙?我想这是不可能的。是否有其他语言(可能是C#?)允许这样做?
最佳答案
这样破坏代码,您将了解您的类GenericBuilder<ConcreteProduct>
没有定义任何setZ()方法。
GenericBuilder<ConcreteProduct> setY = new ConcreteBuilder().setX(1).setY(2);
setY.setZ(3);