黑马程序员技术交流社区
标题:
关于泛型问题
[打印本页]
作者:
Destiny
时间:
2012-3-20 08:18
标题:
关于泛型问题
请看以下代码,为什么不能编译呢
import java.util.*;
public class GenerClass {
public GenerClass() {
}
public static <E extends Number> List<? super E> process(List<E> nums)
{
return null;
}
public static void main(String[] args) {
List<Integer> input = new ArrayList<Integer>(0);
List<Integer> output = process(input);
}
}
复制代码
作者:
马云
时间:
2012-3-20 08:24
本帖最后由 马云 于 2012-3-20 08:27 编辑
<E extends Number> List<? super E>咱能有两个类型呢
作者:
魏昂
时间:
2012-3-20 09:04
是在你第十九行代码出现的问题 编译器上显示的是 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 09:13
马云 发表于 2012-3-20 08:24
List
这个是正确的 一个是整个返回值是泛型 一个是元素类型也是泛型的
List<Integer> input = new ArrayList<Integer>(0);
这里传个0进去是想集合装个0吗 没有这个构造函数的 构造函数有3种默认无惨自动分配初始容量10个
2指定容量 3传另外一个集合进去
作者:
张锐
时间:
2012-3-20 09:27
本帖最后由 张锐 于 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) ,即返回的泛型和形参的泛型一样就可以了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2