返回父类型或子类型之间的区别

时间:2016-08-01 20:13:31

标签: java interface return-type

我想知道(请原谅这是一个重复的问题,但我找不到具体关于我的问题的信息)定义一个方法作为返回父类型或子类型的区别。这是我的具体方案:

想象一下以下的类和接口:

public interface Color{
    public int getRedVal();
    public int getGreenVal();
    public int getBlueVal();
}
public class RGBColor implements Color{
    public int getRedVal() {...}
    public int getGreenVal() {...}
    public int getBlueVal() {...}
}
public class HSVColor implements Color{
    public int getRedVal() {...}
    public int getGreenVal() {...}
    public int getBlueVal() {...}
}

现在,如果我要包含一个名为getRGB()的方法,那么它们之间会有什么区别:

public Color getRGB() {return new RGBColor();}

public RGBColor getRGB() {return new RGBColor();}

我似乎无法找到有关此问题的文档,我确信这是一个简单的答案。无论哪种方式,都要提前感谢答案。

3 个答案:

答案 0 :(得分:2)

public Color getRGB() { return new RGBColor(); }

向上投射在这里(投射到超类型)。你正在研究更抽象的层面而不考虑实现(什么是好的),并且只能使用父方法。

public RGBColor getRGB() { return new RGBColor(); }

您和您的架构与实现(RGBColor)紧密相关,但可以使用此子类中定义的特定方法。

我更喜欢第一个选项而不是第二个选项。

答案 1 :(得分:0)

首先,您应该使工厂方法保持静态。

其次,两种方法的区别在于声明的返回类型。如果你使用了两个定义中的第一个,那么程序员就会写:

Color c = getRGB();  // this is legal

他们写不出来:

RGBColor c = getRGB();  // This is illegal

答案 2 :(得分:0)

如果您已正确编码到界面,则没有太大区别。但是,差异只是参考类型。

假设RGBColor有一个额外的公共方法:

public int[] getRGBFormatVals() //I dunno; I made it up!

您无法在从返回类型Color获取的实例上调用此方法,但如果使用了返回类型RGBColor,则可以。重申我之前的观点,如果您已正确编码到您的界面,则不太可能发生这种情况。

由于您的方法被称为getRGB,我建议您返回RGBColor,因为这应该是从具有此类名称的方法返回的。您可以轻松地将其分配给Color引用,但具有相同的效果并查看结果。