Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重写抽象方法的java正确性_Java_Interface_Abstract Class - Fatal编程技术网

重写抽象方法的java正确性

重写抽象方法的java正确性,java,interface,abstract-class,Java,Interface,Abstract Class,鉴于以下情况: public class RegistryIdModel extends AbstractTableModel{ ContactExtensionProviderLocal provider; . . . @Override public ContactRegistryIdProviderLocal getProvider() { // TODO Auto-generated method stub

鉴于以下情况:

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....
}
公共类RegistrydModel扩展了AbstractTableModel{
ContactExtensionProviderLocalProvider;
.
.
.
@凌驾
public ContactRegistrydProviderLocal getProvider(){
//TODO自动生成的方法存根
退货供应商;
}
}
公共抽象类AbstractTableModel扩展了AbstractModel{
公共抽象MutableEntityProvider getProvider();
}
公共接口ContactRegistrydProviderLocal扩展可变实体提供程序{
……一些方法。。。。
}
让 要重写的RegistryIdModel中的方法 返回类型为 ContactRegistryProviderLocal?

如果我这样做,我的生活会变得更轻松,但是以后会有什么影响呢

坦克的任何帮助或有用的意见!
Marthin

ContactExtensionProviderLocal
是一个
可变实体提供者
,因此,这意味着只要它继续在系统中不知道任何有关
ContactExtensionProviderLocal
的其他部分中充当
可变实体提供者
,它就可以,您已经很好地使用了OO原则,不会有任何问题。

只要您使用的子类型符合指定的接口,就应该可以了。在这种情况下,由于您正在扩展父接口,因此它将符合要求


另一方面,如果所有特定的实现都需要返回特定的类型,我会质疑是否需要在基本(抽象)类中包含此方法。

是的,重写返回类型以返回子类是可以的。您仍然履行由
AbstractTableModel
指定的合同


请注意,这只适用于Java1.5或更高版本。Java 1.4不支持协变返回类型。

您不能覆盖返回类型。您只能提供(或指定)狭义实现。这称为协变返回类型(从Java5开始)。比如说

abstract class A {
    abstract Serializable getId();
}

abstract class B extends A {
    @Override
    abstract Number getId();
}

class C extends B {

    @Override
    Integer getId() {
        return 42;
    }

}

接口
ContactExtensionProviderLocal
ContactRegistrydProviderLocal
的关系究竟如何?
contactRegistrydProviderLocal
ContactExtensionProviderLocal
的实现吗?请检查我的答案。它与您所要求的有点关联。它不是给了您编译错误:“不兼容的类型…”@我向你道歉。现在已经修好了。我从eclipse中复制了错误的代码。
contactRegistrydProviderLocal
是否继承自
MutableEntityProvider
?谢谢您的回答。原因是,我有很多类扩展了AbstractTableView,它们都需要获得一个容器,其中包含正确类型的实体,所以我想强制实现类提供这个功能,因为我有许多不同的容器和实体。这将在将来对我有所帮助,所以我不会忘记这一点,也许这部分可以通过接口来完成,但我在抽象类中还有许多其他方法,所以现在更简单。另一个选择是泛型化并使用泛型参数作为返回类型。:)请澄清术语和正确答案:42。