【发布时间】:2019-06-06 13:10:02
【问题描述】:
我有简单的抽象结构
public abstract class Data<A extends Serializable> {
}
然后是这个类的String实现
public class StringData extends Data<String> {
}
然后我有接口:
public interface Testicek<A extends Serializable> {
public abstract Data<A> test(Data<A> bla);
}
现在我想创建实现这个接口的类:
public class TesticekImpl implements Testicek<String> {
// OK
@Override
public StringData test(Data<String> bla) {
return null;
}
// compilation error
//@Override
//public StringData test(StringData bla) {
// return null;
//}
}
为什么我不能使用我的 StringData 类作为参数,它只适用于返回类型?返回类型和参数的签名相同。
【问题讨论】:
-
因为您实现 Testicek
的事实要求您必须接受 Data 类型的 any 对象。 StringData 只是 Data 的无数子类型中的 一个。这还不够。您必须接受所有这些,否则您根本就没有实现接口。该接口声称它接受所有这些。您可以返回 StringData,因为您可以返回任何符合 Data 条件的内容,而 StringData 可以。 -
@kumesana 这看起来像是对我的回答。
-
是的,但它在评论中,所以我不能接受它:P
-
假设您有
class Parent { void eat(Fruit t){..} }和class Child extends Parent { @override void eat (Apple a){..} }。因为Child extends Parent我们可以写成Parent p = new Child();。但是因为p是Parent类型,它应该支持eat(Fruit),我们应该能够安全地调用p.eat(new Banana())(其中Banana是Fruit的子类型,但不是subtype of Apple)。那么这里应该发生什么?应该调用哪个方法的代码?压倒对 Apples 的有限可接受的论点,但 Parent 承诺处理各种 Fruits。