0

いくつかの内部クラスを持つ外部ジェネリッククラスがあり、そのために外部クラスのジェネリック型を使用したいと思います。

ただし、ジェネリックパラメータを正しく使用する方法がわかりません。

例:

class Outer<E extends CharSequence>{
   class Inner extends ArrayList<E>{
   }

   void func() {
      ArrayList<CharSequence> al = new ArrayList<CharSequence>();
      al.add("abc");    // OK
      CharSequence a = al.get(0);   // OK

      Inner in = new Inner();
      in.add("abc"); // Error: The method add(E) in the type ArrayList<E> is not applicable for the arguments (String)
      CharSequence b = in.get(0);   // OK
   }
}

同じ汎用タイプの外部クラスを使用するように内部クラスを宣言するにはどうすればよいですか?ありがとう

編集+解決策:

ついに私は私が望んでいたことを達成しました、これが結果の例です:

abstract class MyGenericClass<E extends CharSequence>{
   class TheList extends ArrayList<E>{};

   TheList list = new TheList();
}

final class ClassInstance extends MyGenericClass<String>{
};

public class Main{
   public static void main(String[] args){
      ClassInstance c = new ClassInstance();

      c.list.add("abc");
      String s = c.list.get(0);
   }
}

私の要件は、ジェネリッククラスと、その親クラスと同じ型パラメーターを使用するジェネリックコンテナーを含めることでした。

注:CharSequence / Stringは使用例のパラメーターであり、実際の使用法は異なります。

4

3 に答える 3

4

それは根本的に危険です。

作ったらどうなるOuter<StringBuilder>
にを追加することにStringなりArrayList<StringBuffer>ます。

のコレクションがある場合<E extends CharSequence>、そのコレクションに入れることができる唯一のタイプセーフなものは、のインスタンス(またはE 、、を拡張するクラス)です。Enull

于 2012-11-15T19:05:58.553 に答える
2

同じ汎用タイプの外部クラスを使用するように内部クラスを宣言するにはどうすればよいですか?

Inner はすでにと同じジェネリック型を使用していOuterます。問題はfunc、それを使用していない、使用しているということですCharSequence

SLaksが説明し funcたように、:で呼び出された場合を除いて、すべての場合でファンキーな処理を実行しますOuter<CharSequence>。たとえば、呼び出された場合Outer<String>は、にを追加CharSequenceArrayList<String>ます。

さて、func すでにその具体的なタイプのオブジェクトがあった場合:

void func(E e) 
{
    Inner in = new Inner();
    in.add(e);
}          

それは正しいことをするでしょう。したがって、コンパイラはこれを許可します。

直面している特定の問題から一般的な質問を作成しようとしたようです。あなたがやろうとしていることと失敗していることを説明した場合、ここでそれを解決する可能性が高くなります。

于 2012-11-15T20:14:45.567 に答える
-3
 class Inner extends ArrayList<CharSequence>{
 }
于 2012-11-15T19:24:44.330 に答える