具有泛型参数类型的重载构造函数(extends vs. extends和Interface)

时间:2018-06-12 10:47:19

标签: java generics constructor overloading extends

A is abstract

public <T extends A> B(T parameter) {
    //...do some stuff with A features
}
public <T extends A & I> B(T parameter) {
    //...do some stuff with A and I features
}

这段代码不起作用,因为java说:方法B(T)的擦除与B类中的另一种方法相同

但为什么呢?我不明白。当我有一个对象A时,拿第一个Construktor,当A实现我另一个......

我的意思是你可能想要在这种情况下说A总是实现我,但没有:

看看这个:

C1延伸A

C2延伸A

C3扩展A实现I

C1和C2将调用第一个构造函数,C3调用第二个构造函数。为什么这不可能?

我不能这样做:

A is abstract

public B(A parameter) {
    //...do some stuff with A features
}
public B(I parameter) {
    //...do some stuff with I features
}

因为如果A实现我它总是会选择第一个构造函数。如果你知道另一种避免这个问题的方法,请告诉我。

1 个答案:

答案 0 :(得分:1)

这是遗产。请参阅此问题以获得解释:documentation

你只能通过两种不同的工厂方法和两个不同的名称来解决它:

class B {
    public static <T extends A> B create(T param) {
        return new B(/*...*/);
    }

    public static <T extends A & I> B createWithI(T param) {
        return new B(/*...*/);
    }

    private B(/*args*/) {
        //...
    }
}

或建议Method has the same erasure as another method in type使用instanceof

class B
{
    @SuppressWarnings("unchecked")
    public <T extends A, AI extends A & I> B(T param) {
        if (param instanceof I) {
            AI ai = (AI) param;
            // A and I
        }
        else {
            // Just A
        }
    }
}