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实现我它总是会选择第一个构造函数。如果你知道另一种避免这个问题的方法,请告诉我。
答案 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
}
}
}