0

質問を拡張するだけです..

抽象クラスとインターフェースで同じメソッド

クラスがインターフェイスを実装し、抽象クラスを拡張し、両方が同じメソッド (名前 + 署名) を持っているが、戻り値の型が異なるとします。メソッドをオーバーライドすると、戻り値の型をインターフェイス宣言の型と同じにした場合にのみコンパイルされます。

また、メソッドが抽象クラスまたはインターフェイスでプライベートまたはファイナルとして宣言されている場合はどうなりますか?

**余談ですが。アインシュタイン氏は、インタビュー中に忌まわしいほどの時間、この質問に固執しました。私たちがこれを行う一般的なシナリオはありますか、それとも彼は自慢しているだけですか?

4

4 に答える 4

2

いいえ、Java ではメソッド名とパラメーターは同じですが、戻り値の型が異なることはできません。基盤となる Java 型システムは、実行時にメソッドへの呼び出しの違いを判断できません*。

(*誰かが私が間違っていることを証明すると確信していますが、解決策はとにかく悪いスタイルと見なされる可能性が最も高いです。)

private/final について: これらのメソッドを実装する必要があるため、インターフェイス メソッドも抽象メソッドも final にすることはできません。インターフェイス メソッドはデフォルトで public です。抽象メソッドは、実装クラスで可視でなければならないため、プライベートにすることはできません。そうしないと、実装クラスがメソッドを「見る」ことができないため、メソッドの実装を実現できません。

于 2013-08-13T07:35:31.657 に答える
1

インターフェイスでは、メソッドはデフォルトで抽象的でパブリックであるため、他のアクセス指定子を持つことはできず、最終的なものにすることはできません

抽象クラスでは、抽象メソッドはプライベート以外のアクセス指定子を持つことができ、それらは抽象であるため、最終的なものにすることはできません

オーバーライド中、メソッドのシグネチャは同じでなければなりません。および共変 (宣言された戻り値の型のサブクラス) 戻り値の型が許可されます

于 2013-08-13T07:17:33.650 に答える
1

クラスは、同じ名前で戻り値の型が異なるメソッドを持つ 2 つのインターフェイスを実装できません。コンパイル時エラーが発生します。インターフェイス内のメソッドは、デフォルトでパブリック抽象であり、他の指定子はありません。

interface A
{
  public void a();
}
interface B
{
  public int a();
}

class C implements A,B
{

  public void a() // error
 {
    //implementation
 }

 public int a() // error
 {
    //implementation
 }

 public static void main(String args[])
 {

 }
}
于 2016-06-19T04:38:42.993 に答える