java覆盖抽象方法的正确性

时间:2011-05-17 15:29:28

标签: java interface abstract-class

鉴于以下内容:

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

4 个答案:

答案 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不支持协变返回类型。