Java 返回父类型或子类型之间的差异

Java 返回父类型或子类型之间的差异,java,interface,return-type,Java,Interface,Return Type,我想知道(请原谅,如果这是一个重复的问题,但我找不到关于我的问题的具体信息)将方法定义为返回父类型或子类型之间有什么区别。以下是我的具体场景: 设想以下类和接口: public interface Color{ public int getRedVal(); public int getGreenVal(); public int getBlueVal(); } public class RGBColor implements Color{ public int

我想知道(请原谅,如果这是一个重复的问题,但我找不到关于我的问题的具体信息)将方法定义为返回父类型或子类型之间有什么区别。以下是我的具体场景:

设想以下类和接口:

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();}


我似乎找不到与此相关的文档,我相信这是一个简单的答案。无论哪种方式,请提前感谢您的回答。

首先,您应该将工厂方法设置为静态

其次,这两个方法之间的区别在于声明的返回类型。如果使用两个定义中的第一个,程序员会编写:

Color c = getRGB();  // this is legal
他们不会写:

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

如果您对接口进行了正确编码,则不会有太大差异。然而,区别仅仅在于引用类型

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

public int[] getRGBFormatVals() //I dunno; I made it up!
您将无法对从返回类型
Color
获得的实例调用此方法,但如果使用返回类型
RGBColor
,则可以调用此方法。重申我前面的观点,如果您对接口进行了正确的编码,就不太可能发生这种情况

由于您的方法名为
getRGB
,我建议您返回一个
RGBColor
,因为这是使用此名称的方法应该返回的全部内容。您也可以轻松地将其指定给
颜色
引用,以获得相同的效果并查看结果

public Color getRGB() { return new RGBColor(); }
向上投射(投射到超级类型)。您在更抽象的层次上工作,不考虑实现(什么是好的),只能使用父方法

public RGBColor getRGB() { return new RGBColor(); }
您和您的体系结构与实现紧密相连(
RGBColor
),但可以使用此子类中定义的特定方法

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

可能重复的选项
public RGBColor getRGB() { return new RGBColor(); }