(对不起,双关语)

假设有人想定义一个通用生成器,如下所示:

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);

10-04 18:31