7

基本クラスBaseとその派生クラスDerivedは、参照がインスタンスを参照できるtype compatibleという事実を指します。 つまり 、タイプがタイプ互換性がないため、反対の場合はキャストが必要になります。 この概念はプリミティブ型には適用できませんか? 私はこれを意味します BaseDerived
Base b = new Derived();


short shortNumber = 10;  
int intNumber = shortNumber;  

私には同じことのように思えます(また、キャストは必要なく、両方ともshortint が整数型であるため)。
基本クラスでメソッドをオーバーライドする場合、戻り値の型が基本クラスの戻り値の型と同じか、少なくとも型互換性があることが許容されるのはなぜですか?たとえば、これは整数型には適用されません。
たとえば、なぜこれが受け入れられないのですか?

public class Person {    

    public int getId(){  
        return 1;  
    }           
}   


public class Employee extends Person {    

    public short getId(){  
        return 0;  
    }  

}  
4

4 に答える 4

7

あなたのコード例が無効である直接的な答えは簡単です:共変の戻り値の型の Java 言語機能は、明示的にプリミティブには適用されませ。JLS 8.4.5およびJLS 8.4.8.3参照してください。

ここではオートボクシングは適用されません。戻り値の型をIntegerおよびShortに変更した場合でも、どちらも他方のサブクラスではないため、戻り値の型を代用することはできません。

「JLS がプリミティブの共変の戻り値の型を許可しないのはなぜですか」という質問には答えられません。

于 2012-07-22T09:28:32.160 に答える
3

Java 1.5 以降、short と int はすべて and に自動ボックス化可能でShortありInteger、Short は Integer を拡張しません (たとえば、MAX_VALUE が異なります)。

これが問題になる理由の 1 つですが、本当の理由は、Java 言語の設計上の決定の 1 つであると思います。型を変更する場合は、そのことに注意してください。

于 2012-07-22T09:16:37.923 に答える
2

戻り値の型に基づいてメソッドをオーバーライドすることはできません。許可されておらず、コンパイラはオーバーライドされたメソッドとして扱われないと文句を言います。

また、関数呼び出しは、戻り値の型に基づいて決定論的ではありません。たとえば、あなたが電話した場合

someObj.getId();

コンパイラはどのメソッドを呼び出す必要があるかをどのように判断しますか? コンパイラの観点からは、戻り値を処理していないことは重要ではありません。

于 2012-07-22T09:26:32.733 に答える
2
  1. JLS #8.4.8.3 : オーバーライドと非表示の要件

    戻り値の型 R1 を持つメソッド宣言 d1 が、戻り値の型 R2 を持つ別のメソッド d2 の宣言をオーバーライドまたは非表示にする場合、d1 は d2 に対して戻り値の型を代入可能 (§8.4.5) である必要があります。そうしないと、コンパイル時エラーが発生します。
    このルールは、共変の戻り値の型を許可します - メソッドをオーバーライドするときに、メソッドの戻り値の型を改良します。

  2. JLS # 8.4.5 : メソッドの戻り値の型 - オブジェクトとプリミティブは同じようには扱われません (強調は私のものです):

    戻り値の型 R1 を持つメソッド宣言 d1 は、次の条件が満たされる場合に限り、戻り値の型 R2 を持つ別のメソッド d2 の戻り値の型置換可能です。

    • R1 が無効の場合、R2 は無効です。
    • R1 がプリミティブ型の場合、R2 は R1 と同じです。
    • R1 が参照型の場合:
      • R1 が R2 のサブタイプであるか、R1 がチェックなしの変換 (§5.1.9) によって R2 のサブタイプに変換できるか、または
      • R1 = |R2|

あなたの最初の例に関しては、それは拡大変換(short -> int)と呼ばれ、メソッドのオーバーライドのコンテキストでは適用されません。

于 2012-07-22T09:58:40.570 に答える