为什么类型兼容性在覆盖方法时也不适用于原语?

Cra*_*lus 7 java polymorphism inheritance overriding

当我们说Base类Base及其派生类时Derived,type compatible我们引用了一个Base引用可以引用Derived实例的事实.
Base b = new Derived();
对于oposite,需要一个铸件,因为类型不是类型兼容的.
现在这个概念不适用于原始类型吗?
我是说这个

short shortNumber = 10;  
int intNumber = shortNumber;  
Run Code Online (Sandbox Code Playgroud)

看起来一样的东西对我来说(如需要还没有铸造,都shortint 都是整数类型).
因此,当重写基类中的方法时,为什么返回类型与基类的类返回类型相同或至少类型兼容是可接受的,但这不适用于整数类型,例如?
例如,为什么这是不可接受的?

public class Person {    

    public int getId(){  
        return 1;  
    }           
}   


public class Employee extends Person {    

    public short getId(){  
        return 0;  
    }  

}  
Run Code Online (Sandbox Code Playgroud)

Chr*_*rau 7

直接的答案,为什么你的代码示例是无效的,很简单:Java语言特性协变返回类型明确并不能适用于原语.参见JLS 8.4.5JLS 8.4.8.3.

自动装箱不适用于此处.如果将返回类型更改为IntegerShort,它们仍然不是返回类型可替换的,因为它们都不是另一个的子类.

我无法回答"为什么JLS不允许原语的协变返回类型"的问题,即为什么语言设计者决定不应该允许它.


Miq*_*uel 3

从 Java 1.5 开始,您的 Shorts 和 Ints 都可以自动装箱为ShortInteger,并且 Short 不会扩展 Integer (例如,它具有不同的 MAX_VALUE)。

这是出现问题的原因之一,但我认为真正的原因是 java 语言设计决策之一:如果您要更改类型,我们希望您意识到这一点。