A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© Destiny 中级黑马   /  2012-3-20 08:18  /  1823 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请看以下代码,为什么不能编译呢
  1. import java.util.*;  
  2. public class GenerClass {  
  3.          

  4.     public GenerClass() {  
  5.     }  
  6.         
  7.   
  8.     public static <E extends Number> List<? super E> process(List<E> nums)  
  9.     {  
  10.         return null;  
  11.     }  
  12.   
  13.       

  14.     public static void main(String[] args) {  
  15.         
  16.       List<Integer> input = new ArrayList<Integer>(0);  
  17.       List<Integer> output = process(input);   
  18.       
  19.          
  20.     }  
  21. }  
复制代码

4 个回复

倒序浏览
本帖最后由 马云 于 2012-3-20 08:27 编辑

<E extends Number> List<? super E>咱能有两个类型呢
回复 使用道具 举报
   是在你第十九行代码出现的问题 编译器上显示的是 cannot convert from List<capture#1-of ? super Integer> to List<Integer>,如List<Integer> output = process(input);  这样的转换是不行的必须要加以强制转换 如List<Integer> output = (List<Integer>) process(input);   
回复 使用道具 举报
马云 发表于 2012-3-20 08:24
List

这个是正确的 一个是整个返回值是泛型 一个是元素类型也是泛型的
List<Integer> input = new ArrayList<Integer>(0);  
这里传个0进去是想集合装个0吗 没有这个构造函数的 构造函数有3种默认无惨自动分配初始容量10个
2指定容量  3传另外一个集合进去
回复 使用道具 举报
本帖最后由 张锐 于 2012-3-20 09:33 编辑

LZ 应该是第9行 public static <E extends Number> List<? super E> process(List<E> nums)  这里有问题,首先你用了<E extends Number>限定了这个泛型函数中只能使用number的子类,然后传入的形参是List<E>这里没问题。但是你返回的又想要List<? super E>,这里就有问题了,因为如果你返回的?是E的超集,如果范围大于number的范围的话,这里泛型就失去对函数里面参数的“控制了”,但是如果你返回写成<E extends Number>的话,又可能和后面形参的E没有交集。所以这里就涉及到一个两边都有限定的问题了。
不知道泛型能不能表示成区间的形式,但是对这个问题有种解决办法是把这行改成public static <E extends Number> List<E> process(List<E> nums) ,即返回的泛型和形参的泛型一样就可以了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马