我如何实例化?包含代码

时间:2012-07-13 06:39:54

标签: java interface

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

我有点迷失 - 请帮忙!

3 个答案:

答案 0 :(得分:4)

M< X, Y >的构造函数希望收到XY,但您尝试为其IA< X, Y >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);
}

答案 1 :(得分:1)

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

如果你想问一下如何更改泛型约束以使其有效,这里有一个更简单的事情(它只是改变了泛型(但保持WM原样)而没有别的从原始的)编译,并可能更接近你想要的东西:

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>()。那是什么意思?您没有定义XY。在实际代码中永远不会有这样的方法。