论坛首页 Java企业应用论坛

关于Java泛型 与 类型推断

浏览 21727 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (1) :: 隐藏帖 (12)
作者 正文
   发表时间:2012-02-13  
前题:
  当编译器解析泛型时,设法推断类型参数它能达到的最具 体类型。

我想关于这一点并不陌生,关于类型推断当然不止限于泛型的应用。当然现在这个问题是与泛型相关的,所以我们只讨论泛型的类型推断。

public static<T> T identity(T arg) { return arg };

和它的调用:

Integer i = 3;
System.out.println(identity(i));

编译器能够推断 T 是 Integer、Number、 Serializable 或 Object,但它 选择 Integer 作为满足约束的最具体类型。

但是在我们用通配符的时候编译的推断却很“弱智”


假设有下面的情况:Fruit 为父类,Apple为子类。

List<Apple> apples = new ArrayList<Apple>();
List<? extends Fruit> fruits = apples;

现在fruits里面加不进去任何的对象。 

List<? extends Fruit> 表示是: 一个存放Fruit子类型的List。  但是我们将apples赋值给了fruits ,那么这个时候为什么编译器却不推断:fruits 的类型为:List<Apple>列?

   发表时间:2012-02-13  
有人说我的想法是错的,那么假设现在有这么种情况:


public void foo(Object o)

public void foo(String str)

现在有这么一个调用:foo("123");他会调用foo(String str)这个方法,那这个就是类型推断了。。他可以推断到最具体的类型。

但是为什么贴子中的类型他就不能推断了列?


0 请登录后投票
   发表时间:2012-02-13  
没有人。~
0 请登录后投票
   发表时间:2012-02-13  
lz你需要的是动态语言
0 请登录后投票
   发表时间:2012-02-13  
楼主需要的是PECS口诀。《Effective Java》第二版原文版的136页。
0 请登录后投票
   发表时间:2012-02-13  
RednaxelaFX 写道
楼主需要的是PECS口诀。《Effective Java》第二版原文版的136页。

烧香,拜拜~~  神啊。 136页都能记下来
0 请登录后投票
   发表时间:2012-02-13  
RednaxelaFX 写道
楼主需要的是PECS口诀。《Effective Java》第二版原文版的136页。

PECS口诀时什么呀?
0 请登录后投票
   发表时间:2012-02-14   最后修改:2012-02-14
Java的泛型一直搞不懂...
0 请登录后投票
   发表时间:2012-02-14  
List<Fruit> fruits = new ArrayList();
fruits.add(new Apple());

我想楼主是想多了
0 请登录后投票
   发表时间:2012-02-14  
List<? super Fruit> list = new ArrayList<Apple>();  
list.add(new Apple()); 
list.add(new Fruit());
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics