2017-05-02 14 views
0

staticメソッドでAという名前の基本クラスを作成し、同じ名前を持つ汎用静的メソッドを持つサブクラスBを作成すると、コンパイラは失敗します。Genericの名前の衝突

静的メソッドが別の静的メソッドをオーバーライドできないことはわかっているので、隠れの概念を理解することで、エラーではなく再生されるはずです。

名前の衝突:私は取得しています

エラーがあるメソッドM1()タイプBの タイプAの()M1と同じ消去を持っていますが、それを

を隠していませんしかし、以下に含まれるサンプルコードからジェネリック型パラメータを削除すると、正しくコンパイルされます。

class A { 
    static void m1() { 
     System.out.println("Base"); 
    } 
} 

class B extends A { 
    static <T> void m1() {// Name clash error here 
     System.out.println("Sub"); 
    } 
} 

public class Test { 
    public static void main(final String[] args) { 
     B.m1(); 
     A.<Object>m1(); 
    } 
} 

なぜこのように動作するのか教えていただけますか?

+3

「A.m1()」と「B. m1() '? – BackSlash

+0

提供した例の場合、** genericパラメータは必要ありません**。私はあなたがエラーを起こしている理由は、あなたがそれを使用せずにジェネリックパラメータを必要としているということです。 – staa99

+0

@ BackSlash-はい、正しくあります。エラーコード –

答えて

4

問題は、2つのメソッドが同じ消去を持ちますが、同じシグネチャを持たないため、どちらも他のシャドウに影響を与えないことです。ジェネリック型を削除すると、BのメソッドはA(同じシグネチャ)から同じ名前のメソッドをシャドウし、すべて正常です。私は議論の上から理解何

+1

@BackSlash私はそれが誤植であると仮定します。 – kaqqao

+0

@BackSlash no:通話を削除してもエラーは残ります。 –

+0

@ BackSlash--はい、みんなが問題を理解していない、もっと簡単な言語で質問を編集して、すべての人が同じページにあるようにすることができたら –

0

がある:道徳的

、サブクラスでは一般的な静的メソッドは、スーパークラスで同じ名前とシグネチャを持つ非ジェネリックの静的メソッドを隠します。

技術的には、サブクラスメソッドはスーパークラスメソッドのサブシグネチャでなければなりません。 B.m1()A.m1()のでA.m1()B.m1()を非表示にするものではないので、B.m1()B.m1()のサブシグニチャとみなされていない、タイプパラメータの同じ数を有していません。

+0

ジェネリックメソッドは非ジェネリックを隠すわけではありません。これは基本的にコンパイラです:私があなたが尋ねたことをしたならば、あなたが隠そうとしなかったものを隠すことになるので、あなたはそれを自分で処理しなければなりません。 – kaqqao

関連する問題