所以,我们说我有以下课程:
abstract class Foo{
.
.
.
public void setKey(FooKey key){
this.key = key;
}
}
final class Bar extends Foo{
.
.
.
@Override
public void setKey(BarKey key){ // Can't do this?
super.setKey(key);
}
}
在上面的示例中,BarKey
是FooKey
的子类。在这里,我想确保为Bar
设置的密钥是FooKey
的特定子类(即BarKey
)。我该怎么做?我是否过于复杂?有更好的设计方法吗?
答案 0 :(得分:4)
这是不正确的,因为您使子类比超类更具限制性:超类可以设置任何类型的FooKey,但子类只接受BarKey。
为了做到这一点,你需要使超类通用:
abstract class Foo<K extends FooKey> {
private K key;
public void setKey(K key){
this.key = key;
}
}
final class Bar extends Foo<BarKey> {
}
答案 1 :(得分:2)
你不能这样强制执行。考虑:
Bar b = new Bar();
FooKey k = new FooKey();
b.setKey(k); // You want to prohibit this
Foo f = b;
f.setKey(k); // But there's no way to prohibit this
通常,派生类不能提供更多限制性接口而不是超类。
所以我建议从抽象类中删除setKey
。
答案 2 :(得分:2)
您应该阅读覆盖和重载之间的区别。你所做的只是重载,因为你改变了覆盖不允许的参数类型。
答案 3 :(得分:0)
简单地删除@Override
注释,因为你没有覆盖超类的方法(应该是相同的参数),你只是定义一个更窄类型的新setKey
方法。但是,这个新的setKey方法只能通过Bar
引用访问。