4

编译器不允许我将 <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

我有点迷路 - 请帮忙!

4

3 回答 3

4

的构造函数M< X, Y >期望接收 anX和 a Y,但您试图给它 anIA< X, Y >和 a IB< X, Y >。必要的关系被颠倒了;XIA< 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);
}
于 2012-07-13T06:49:17.277 回答
1

这个问题涉及许多没有意义的通用约束。M<X,Y>的构造函数接受类型参数XY,它们是泛型方法的类型参数check(这意味着调用者可以决定XY成为任何东西,这仍然需要工作)。那么为什么你期望ab(或其他任何事情)是正确的类型?

如果您想问如何更改泛型约束以使其工作,这里有一个更简单的东西(它只是更改泛型(但保持原样)而不是原始的其他东西),它可以编译,并且可能更接近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);
}
于 2012-07-13T20:00:14.377 回答
0

虽然我看到你不想这样做:

@SuppressWarnings("unchecked")
W<X,Y> s = new M<X,Y>((X) a,(Y) b);

确实有效。

正如 Mental 法官所说,您的问题过于抽象,我们很难提供有意义的帮助。例如,在check方法中,您正在创建new A<X,Y>(). 这意味着什么?你没有定义Xand Y。实际代码中永远不会有这样的方法。

于 2012-07-13T13:55:28.750 回答