4

以下は問題なくコンパイルされます

boolean flag = true;
Boolean flagObj = flag; 

次のシナリオをイメージする

interface ITest{

     Boolean getStatus();

}

 class TestImpl implements ITest{

     public boolean getStatus(){ // Compile error: return type is incompatible
         return true;
     }
 }

私の質問は、上記の行でのコンパイル エラーに関するものです。私のインターフェイスは戻り値の型について言及していますBooleanが、実装されたメソッドはbooleanリテラル)を返します

私の質問は、Booleanbooleanが互換性がある場合、コンパイラが不平を言っているのはなぜですか? ここではオートボクシングは適用されませんか?

4

3 に答える 3

5

親の戻り型のサブクラスのみを返すことができます。

コンパイルにより、プリミティブとラッパーの間で自動ボックス化およびボックス化解除が可能になりますが、これにより一方が他方のサブクラスにはなりません。プリミティブはクラスではなく、提案した方法では使用できません。

getStatus() を返すBooleanか、親を返すだけですboolean

理論的には、自動ボクシングを拡張してあなたの提案を許可することはできますが、あまり役に立たないと思います。

理論的には、これを書くこともできます

class A {
    int method() { ... }
}

class B extends A {
    short method() { .... }
}

コンパイラは暗黙的なアップキャストをサポートしているため。しかし、繰り返しになりますが、これもあまり役に立たないと思います。

于 2013-07-09T12:43:56.130 に答える
0

メソッドは、プロトタイプと実装で異なる署名を持っています。Booleanクラスではないプリミティブは、プロトタイプの をサブクラス化できません。オートボクシングがあっても、実装は一般的なプロトタイプに違反しています。自動ボックス化解除はリターンに実行されるため、getStatus が次のように実装されている場合:

public Boolean getStatus(){ // Compile error: return type is incompatible
     return Boolean.TRUE;
}

次のように戻った後、ボックス化解除できます。

if(getStatus()) doSomething();
于 2013-07-09T12:44:39.007 に答える
0

ご存知のように、親の戻り値の型のサブクラスしか返すことができません。ここで、ブール値はラッパー クラスであり、ブール値はプリミティブ データ型です。要するに、両者はラッパー クラスとプリミティブとして異なります。したがって、互換性がないというエラーが発生します。

于 2013-07-09T12:48:46.417 に答える