编译器不允许我保留< X,Y>在最后一行,我不明白为什么。
如何编译这样的通用构造?
我尝试将代码更改为:
X a = new A<X,Y>(); // "Type mismatch: cannot convert from A<X,Y> to X"
Y b = new B<X,Y>(); // "Type mismatch: cannot convert from B<X,Y> to Y"
W<X,Y> s = new M<X,Y>(a,b); // no error
我有点迷失 - 请帮忙!
答案 0 :(得分:4)
M< X, Y >
的构造函数希望收到X
和Y
,但您尝试为其IA< X, Y >
和IB< X, Y >
。必要的关系是相反的; X
是IA< X, Y >
,但反之亦然,Y
同样如此。
以下编译,但似乎对你所追求的目标不够严格:
class A<X extends IA<X,Y>, Y extends IB<X,Y>> implements IA<X,Y>{}
class B<X extends IA<X,Y>, Y extends IB<X,Y>> implements IB<X,Y>{}
interface IA<X extends IA<X,Y>, Y extends IB<X,Y>> {}
interface IB<X extends IA<X,Y>, Y extends IB<X,Y>> {}
class M<X extends IA<X,Y>, Y extends IB<X,Y>> extends W<X,Y>{
public M(IA<X,Y> x, IB<X,Y> y){} // this is the only change
}
class W<X extends IA<X,Y>, Y extends IB<X,Y>> {}
//To my check class code:
public <X extends IA<X,Y>, Y extends IB<X,Y>> void check() {
IA<X,Y> a = new A<X,Y>();
IB<X,Y> b = new B<X,Y>();
W<X,Y> s = new M<X,Y>(a,b);
}
答案 1 :(得分:1)
这个问题涉及许多没有意义的通用约束。 M<X,Y>
的构造函数接受类型X
和Y
的参数,它们是泛型方法check
的类型参数(这意味着调用者可以决定X
和Y
是什么,这需要仍然有效。那么为什么你期望a
和b
(或其他任何事情)是正确的类型?
如果你想问一下如何更改泛型约束以使其有效,这里有一个更简单的事情(它只是改变了泛型(但保持W
和M
原样)而没有别的从原始的)编译,并可能更接近你想要的东西:
public interface IA<X, Y> {}
public interface IB<X, Y> {}
public class A implements IA<A,B>{}
public class B implements IB<A,B>{}
public class M<X extends IA<X,Y>, Y extends IB<X,Y>> extends W<X,Y>{
public M(X x, Y y){}
}
public class W<X extends IA<X,Y>, Y extends IB<X,Y>> {}
//To my check class code:
public void check() {
A a = new A();
B b = new B();
W<A,B> s = new M<A,B>(a,b);
}
答案 2 :(得分:0)
虽然我看到你不想这样做:
@SuppressWarnings("unchecked")
W<X,Y> s = new M<X,Y>((X) a,(Y) b);
确实有效。
正如智能法官所说,你的问题太抽象,我们很难提供有意义的帮助。例如,在check
方法中,您正在创建new A<X,Y>()
。那是什么意思?您没有定义X
和Y
。在实际代码中永远不会有这样的方法。