1

下面代码中的 listNum.add(num) 有什么问题;(参考- http://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html

它给出了编译错误 List 类型中的方法 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

1

listNum可能是 的一个实例,List<Long>并且您不能将 a 添加Number到 的列表中Long,因为它会引发类强制转换异常。

解决方案:

  1. listNum一个List<? super Number>
  2. num一个Long
于 2013-04-10T11:48:56.077 回答
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 回答
0

我想让我给你一个直截了当的答案:你不能这样做,因为它不应该得到支持。

如果您创建 List l = new ArrayList

然后,您只能在列表 l 中添加仅长长的元素。在创建时,您将 List 放入 List 。

原始对象是 List 。一个类可以有多级超类。例如,假设 Number 扩展了某个类说 Serializable ,那么这意味着 List 不能拥有一个可序列化的类,它是它的上层类。

因此,为了避免这个问题,它在 java 中是不允许的。

检查泛型的 PECS 主体。

于 2019-11-22T22:41:49.523 回答
0

问题不在于泛型实现,而是一个基本的 Java Collection 框架错误,其中您无法将Number类型添加到Long类型。泛型只是在编译时解决它。如果泛型不在这个地方,您将遇到运行时异常,即 ClassCastException。

于 2015-09-07T08:13:59.180 回答