3

Javaには、次のクラス構造があります。

クラスすべて
+-- クラス A はすべてを拡張
+-- クラス B はすべてを拡張

クラス ContainAll
+-- クラス ContainA は ContainAll を拡張
+-- クラス ContainB は ContainAll を拡張

すべての「含む」クラスには、リンクされたリストとメソッドがあります

public addElement(All a) {
    list.add(a)
}

クラス ContainAll はインスタンス化するべきではありませんが、クラス ContainA および ContainB はインスタンス化できます。
ジェネリックを使用して、クラス ContainB の addElement がタイプ B からのみオブジェクトを取得できることを明確にする方法は次のとおりです。

public abstract class ContainAll<T extends All> {}

public class ContainB<T extends B> extends ContainAll<All> {
    public addElement(T b) {
        list.add(b);
    }
}

しかし、この例は機能しません。試してみました。読んでくれてありがとう。

4

3 に答える 3

4

クラスをContainAll抽象化し(要件の1つはインスタンス化できないため)、実装します.addElement()

public abstract class ContainAll<T extends All>
{
    private final List<T> list = new LinkedList<T>();

    // ...

    // FINAL! Subclasses cannot override it
    public final void addElement(final T element)
    {
        list.add(element);
    }
}

次に、などを実装ContainAします。「自動的に」機能します。ContainAll<A>.addElement()

于 2013-06-14T10:55:03.870 に答える
0

ここに解決策があります:

//クラスA

package limitgeneric;

public class A {

}

//クラスB

package limitgeneric;

public class B {

}

//ContainAll クラス

package limitgeneric;

public abstract class ContainAll<T> {
     public abstract void addElement(T t);
}

// クラスの内容 A

package limitgeneric;

import java.util.ArrayList;
import java.util.List;

public class ContainA<T extends A> extends ContainAll<T> {
     List<T> locallist = new ArrayList<T>();
     public void addElement(T t) {
          locallist.add(t);
     }
}

//クラスはContainB

  package limitgeneric;

  import java.util.ArrayList;
  import java.util.List;

  public class ContainB<T extends B> extends ContainAll<T> {
    List<T> locallist = new ArrayList<T>();
    public void addElement(T t) {
        locallist.add(t);
    }
  }

//メインクラス

  package limitgeneric;

  public class Main {
      public static void main(String[] args) {
          ContainA<A> a = new ContainA<A>();
          //a.addElement(new B());
          a.addElement(new A());
          //ContainA<B> b = new ContainA<B>();
      }
  }
于 2013-06-14T10:58:54.467 に答える