1

以下のコードの listNum.add(num) の何が問題になっていますか。(参照- http://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html )

リスト型のメソッド add(capture#1-of ? super Long) は引数 (Number) には適用されないため、コンパイル エラーが発生します。

public class GenericSuper {

   List<? super Long> listNum = new LinkedList < Number >();
   List<? super ExportException> listExp= new LinkedList<RemoteException>();

   public List<? super ExportException> addList()
   {
      Number num = 10;
      listNum.add(num);
      RemoteException rme = new RemoteException();
      listExp.add(rme);
      return rme;
   }
}
4

4 に答える 4

0

問題はジェネリックの実装ではなく、Number型をLong型に追加できないという基本的な Java コレクション フレームワークの間違いです。ジェネリックはコンパイル時にそれを解決するだけです。

于 2015-09-07T08:13:59.180 に答える
0

率直な回答をさせてください。サポートされるべきではないので、それを行うことはできません。

List l = new ArrayList を作成する場合

次に、長くのみ拡張されるリスト l に要素のみを追加できます。作成時と同様に、 List を List に入れます。

元のオブジェクトは List です。クラスがマルチレベルのスーパー クラスを持つことは可能です。たとえば、 Number が Serializable と言うクラスを拡張するとします。これは、 List がその上位クラスである serializable を保持できないことを意味します。

したがって、この問題を回避するために、Java では許可されていません。

genrics の PECS プリンシパルを確認してください。

于 2019-11-22T22:41:49.523 に答える
0
package main.java.com.mysystems.generics;

import java.rmi.RemoteException;
import java.rmi.server.ExportException;
import java.rmi.server.SocketSecurityException;
import java.util.LinkedList;
import java.util.List;

//peCS
//Consumer super- you want to add item i.e of super type to the collection.
public class GenericSuper {


    List<? super Long> listNum = new LinkedList < Number >();// listNum is variable that can be assigned list of type super class to Long.
    //And you can put Long and its subclass. And you can only get Object type since it can hold anything from Long to Object.

    List<? super ExportException> listExp= new LinkedList<RemoteException>(); // listExp is variable that can be assigned any list of type super class to ExportException. 
    // And you can  put ExportException and all subclasses of ExportException to the list. And you can only get Object type since it can hold anything from ExportException to Object.

    public List<? super ExportException> addList()
    {
        LinkedList < Number > numList = new LinkedList < Number >();

        Number num = 10.10;
        numList.add(num);
        listNum = numList;
        //listNum.add(num); //Compilation error as only long or its subclass can be added.
        listNum.add(20L);

        for(Object e:listNum){ // Note you can only get Object type and will have to use instance of to do anything meaningful.
            System.out.println(e);
        }
        SocketSecurityException sse = new SocketSecurityException("Hello");
       listExp.add(sse);
       return listExp;
       }
   }
于 2013-04-30T03:03:46.130 に答える