锁定老帖子 主题:关于Java泛型 与 类型推断
精华帖 (0) :: 良好帖 (3) :: 新手帖 (1) :: 隐藏帖 (12)
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-14
口诀呢,帅哥
|
|
返回顶楼 | |
发表时间:2012-02-14
RednaxelaFX 写道 楼主需要的是PECS口诀。《Effective Java》第二版原文版的136页。
膜拜大神 |
|
返回顶楼 | |
发表时间:2012-02-14
shbgreenery 写道 List<Fruit> fruits = new ArrayList();
fruits.add(new Apple()); 我想楼主是想多了 我基本用这个, 还有那个string 和 object的事例,说明的是都重载, 跟泛型不是一码事 |
|
返回顶楼 | |
发表时间:2012-02-14
大胡子啊 俺是9
我说你错了的原因是 既然一个方法已经用了泛型了 就说明方法内部的实现最起码的不会对某些特定的类型进行特殊的处理 就算要处理 也应该放到泛型方法调用之前 至于如何获得泛型类型 我记得CSDN上火龙果发过一个方式 我得去找找 |
|
返回顶楼 | |
发表时间:2012-02-14
List<Apple> apples = new ArrayList<Apple>();
List<? extends Fruit> fruits = apples; 这句是不行的,泛型是没有继承关系的,也就是说List<Object>不是List<Integer>的父类,定义一个List<Object>类型参数的方法不能传入List<Integer>. java的泛型在很多时候用起来很恶心。。。 |
|
返回顶楼 | |
发表时间:2012-02-14
public void foo(Object o)
public void foo(String str) 这里叫重载解析,不关泛型的事 通配符类型List<? extends Fruit>可以表示两种泛型 List<Fruit>和List<Apple>,那么你怎么确定 List<? extends Fruit>具体表示什么类型呢, 你只有确定类型以后你才能添加那个类型的对象吧,你现在连类型都不确定怎么添加? 假如是表示List<Apple>,后面对其调用add(new Fruit());岂不是很危险? 你自己当然知道它的实际类型应该是Fruit,因为那是你写的阿,假如你这两行代码隔了几百行,你让编译器怎么去找你之前的定义的类型,假如你想用父类List,直接声明一个List<Fruit>不就好了 |
|
返回顶楼 | |
发表时间:2012-02-14
shbgreenery 写道 List<? super Fruit> list = new ArrayList<Apple>();
list.add(new Apple()); list.add(new Fruit()); 这段代码在eclipse3.7上编译不通过,你是用什么编译器呢 |
|
返回顶楼 | |
发表时间:2012-02-14
再补充一下,关于通配符,带有子类型限定的通配符一般用于从泛型对象读取,带有超类型限定的通配符一般用于向泛型对象写入,无限定类型只能做一些很简单的操作,甚至都不能用new Object()来调用泛型类的setters
|
|
返回顶楼 | |
发表时间:2012-02-14
shbgreenery 写道 List<? super Fruit> list = new ArrayList<Apple>();
list.add(new Apple()); list.add(new Fruit()); 这里有问题阿,? super Apple才对吧 |
|
返回顶楼 | |
发表时间:2012-02-14
xiaoZ5919 写道 shbgreenery 写道 List<? super Fruit> list = new ArrayList<Apple>();
list.add(new Apple()); list.add(new Fruit()); 这段代码在eclipse3.7上编译不通过,你是用什么编译器呢 因为代码有错 |
|
返回顶楼 | |