鉴于以下内容:
public class RegistryIdModel extends AbstractTableModel{
ContactExtensionProviderLocal provider;
.
.
.
@Override
public ContactRegistryIdProviderLocal getProvider() {
// TODO Auto-generated method stub
return provider;
}
}
public abstract class AbstractTableModel extends AbstractModel{
public abstract MutableEntityProvider getProvider();
}
public interface ContactRegistryIdProviderLocal extends MutableEntityProvider<EppContactRegistryId> {
....some methods....
}
让它成为好的/坏的解决方案 RegistryIdModel中要覆盖的方法 返回类型为a ContactRegistryProviderLocal吗 的
如果我这样做,它会让我的生活变得更轻松,但后来会产生什么影响呢?
坦克提供任何帮助或有用的评论! Marthin
答案 0 :(得分:3)
ContactExtensionProviderLocal
是一个MutableEntityProvider
,所以这意味着只要它继续在系统的其他部分中作为MutableEntityProvider
发挥作用,对{{{{{ 1}},你已经很好地使用了OO原则,你就不会有任何问题。
答案 1 :(得分:3)
您无法覆盖返回类型。您只能提供(或指定)窄实施。这称为协变返回类型(自Java 5起)。例如
abstract class A {
abstract Serializable getId();
}
abstract class B extends A {
@Override
abstract Number getId();
}
class C extends B {
@Override
Integer getId() {
return 42;
}
}
答案 2 :(得分:1)
只要您使用的子类型符合指定的接口,您就可以了。在这种情况下,它会符合您的要求,因为您正在扩展父接口。
另一方面,如果您的所有特定实现都需要返回特定类型,我会质疑是否需要在您的基类(抽象)类中包含此方法。
答案 3 :(得分:1)
是的,重写返回类型以返回子类是可以的。您仍然符合AbstractTableModel
指定的合同。
请注意,这仅适用于Java 1.5或更高版本。 Java 1.4不支持协变返回类型。