1

可能重复:
在扩展接口中覆盖返回类型 - 坏主意?

让我们考虑以下界面,

public interface Cat{
    public Object getCat();//returns any type of object
}

public interface DomesticCatInterface{
    public String somethinOnlyRelatedToDomesticCat();
}

public interface WildCatInterface{
    public String somethinOnlyRelatedToWildCat();
}

public class DomesticCat implements Cat, DomesticCatInterface{
    @Override
    public DomesticCat getCat(){
        return this;
    }

    @Override
    public String somethinOnlyRelatedToDomesticCat(){
        return "something";
    }

}

public class WildCat implements Cat, WildCatInterface{
    @Override
    public WildCat getCat(){
        return this;
    }

    @Override
    public String somethinOnlyRelatedToWildCat(){
        return "something";
    }
}

当我需要从课堂上获得参考时,这是一个很好的做法吗?

4

3 回答 3

2

正如每个人都写的那样,可以缩小返回类型。

但是对于您的最后一行问题,如果这是获得参考的好方法,答案是否定的。您不会获得对该对象的引用,但对调用对象(坦率地说,您已经有一个实例),它只会指向同一事物。

使用new关键字获取新实例。

于 2012-12-12T06:01:52.717 回答
2

与其让 getCat() 返回一个 Object,不如让它返回一个 Cat。这你应该能够返回任何实现 Cat 的类。在 java 5 中,这称为协变返回类型

于 2012-12-12T05:38:10.923 回答
0

是的,当您覆盖它时,可以(从 Java 5 开始,我相信)缩小(而不是扩大)方法的返回类型。

当它有助于使您的代码更清洁时,我会说去吧。

请注意,仍然不可能缩小(或扩大)方法参数的类型。

您可能也有兴趣使用自引用泛型来强制实现您的接口。

于 2012-12-12T05:36:51.963 回答