2016-04-07 5 views
0
class A<E>{ 

} 
class B<E> extends A{ 

} 

public class WildInDeclare<E>{ 
    public static void main(String[] args){ 
     A<Integer> obj = new B<Integer>(); 
    } 
} 

上記のプログラムをコンパイルすると、このエラーが発生します。Javaのジェネリックスを使用した継承

Note: WildInDeclare.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 

その後、私はちょうどclass B<E> extends A{、それが正常に動作しますが、それが再びコード例で継承の際A<E>をしてください書くために必要な理由を説明することができますclass B<E> extends A<E>{に交換してください。

私が直面した第2の問題。 上記のコードを次のコードで更新します。

class A<E>{ 
    public A(E o){ 

    } 
} 
class B<E> extends A{ 
    public B(){ 
     super(E); 
    } 
} 

public class WildInDeclare<E>{ 
    public static void main(String[] args){ 
     A<Integer> obj = new B<Integer>(); 
    } 
} 

しかし、なぜコンパイルされていませんか?私は次のエラーを受け取りました。

WildInDeclare.java:8: error: cannot find symbol 
       super(E); 
        ^
    symbol: variable E 
    location: class B<E> 
    where E is a type-variable: 
    E extends Object declared in class B 
Note: WildInDeclare.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 
1 error 

どのように私はパラメータを親クラスに渡すことができますか?

+0

あなたはどのようなコンパイラエラーメッセージが出ますか:あなたはそれだけでスーパークラスのコンストラクタに渡す入力パラメータを取るためにBを望んでいた場合

、それは次のようになりますか? –

+3

であるため、クラスのシグネチャにジェネリックが含まれている 'A'から継承しています。 'A'はrawtypeとして継承されます(クラスBのジェネリック' E'は 'A'のジェネリックとしても使われなければなりません)。 – SomeJavaGuy

+0

@ OleV.V。質問が更新されました。 –

答えて

1

あなたはAは、一種類のパラメータを取り、一般的なクラスですので、それは再び

を書くために必要な理由を説明することができます。理想的には、生のタイプAを参照することはできませんが、A<String>またはA<Integer>またはA<Map<K, List<O>>などを参照することしかできません。Javaでは、下位互換性のためにrawタイプを使用できますが、原則として必須ですパラメータを提供する。

クラスBAに拡張されていると言っても、どのような種類のメッセージが広がっているのかはまだ分かりません。すなわち、一般的なパラメータは何か。 (これは、Bのジェネリックパラメータと同じである必要はありません - 。あなたは可能性があり、たとえばB<E> extends A<String>を定義し、それが一致するであろう)

次のコード...コンパイルされていません。どうして?

このコードは構文上無効です。 Aのコンストラクタを定義して、オブジェクトの汎用パラメータ型を取得します。したがってBのコンストラクタからsuper()を呼び出すときは、そのようなオブジェクトを渡す必要があります。 Eはオブジェクトではありません。これはBの汎用パラメータの名前です。コンパイラが「シンボルを見つけることができません」と言うのは正しいですが、Eという名前のものはありません。

class B<E> extends A<E> { 
    public B(E e) { // this parameter could be called anything, doesn't have to be e 
     super(e); 
    } 
} 
+0

子のコンストラクタのパラメータを持たない親のコンストラクタに渡すには? 'super(3);'も動作しません。 –

+0

'super(3)'は** '3'がジェネリックパラメータ' E'のインスタンスである場合にのみ**動作します。しかし、このパラメータには境界がないため、どの型でも構わないので、コンパイラはこれが一貫していないと正しく言っています。 ( 'A 'のサブクラスである 'B 'を構築しようとすると、 'int'を' String'をとるコンストラクタに渡そうとしています)。一般的に、無制限のパラメータでは、この理由で呼び出し側にコンストラクタパラメータを指定させる必要があります。 –

関連する問題