在接口中更改返回类型为Object的重写方法的返回类型 - java

时间:2012-12-12 05:33:19

标签: java interface

  

可能重复:
  Overriding return type in extended interface - Bad idea?

让我们考虑以下界面,

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";
    }
}

这是一个很好的做法,当我需要从类中获取引用时?

3 个答案:

答案 0 :(得分:2)

不是让getCat()返回一个Object,而是让它返回一个Cat。这应该能够返回任何实现Cat的类。在java 5中,这称为Co-variant return types

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

是的,有可能(因为Java 5,我相信)在覆盖它时缩小(加宽)方法的返回类型。

我会说它,当它有助于使你的代码更清洁。

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

您可能也对using self-referential generics感兴趣,强制执行您的界面。