0

我有:

public class<E extends aninterface> AClass{

    public AClass(){
    }

    public void amethod(E element){
        //something
    }

}

public class B implements aninterface{

}

在调用代码中:

aninterface f = new B();
AClass<B> ac = new AClass<B>();
ac.amethod(f);

它说 f 是类型aninterface,但参数是类型 'E'

如果我不能这样做,我不明白泛型的意义何在?

4

2 回答 2

2

因为AClass<B>.amethod()期望 aB作为参数。但是您将其传递给aninterface.

于 2012-07-14T21:49:52.443 回答
2

请注意,引用 f被声明为 type aninterface——而不是type B。尽管在运行时引用f指向类型的实例B,编译器在这里只寻找引用的声明类型fB要求的类型之间的对齐AClass#amethod(E)

也许你打算写这个?

final aninterface f = new B();
final AClass<? super aninterface> ac = new AClass<aninterface>();
ac.amethod(f);

或者也许是这个?

final B f = new B();
final AClass<? super B> ac = new AClass<B>();
ac.amethod(f);

同样,请注意 aB是 a aninterface,但不是相反:ananinterface不是 a B。因此,您不能为aninterface需要类型参数的方法提供类型引用B

于 2012-07-14T21:57:59.263 回答