代码之家  ›  专栏  ›  技术社区  ›  nanda

为什么隐式类型推断只在赋值中起作用?

  •  2
  • nanda  · 技术社区  · 15 年前

    我知道,在赋值中使用泛型,方法可以通过查看左侧变量的类型来隐式地了解返回类型的类型。

    google集合中的示例:

    List<String> l = Lists.newArrayList()
    

    我的问题是,为什么它不适用于方法或更高类型的推理?

    例子:

    List<List<String>> ll = Lists.newArrayList();
    ll.put(Lists.newArrayList()); // doesn't work
    

    这在JLS中有规定吗?如果是,为什么?如果不是,那么这是一种可以从Java 7期待的改进吗?

    这让我恼火,因为我们在Java中遇到了问题,就像我很久以前在Delphi中遇到的问题一样,我不能做链式方法调用:

    C c = a.b().c();
    

    在Delphi(IIRC)中,您必须:

    B b = a.b();
    C c = b.c();
    

    看起来像“德贾乌”

    1 回复  |  直到 15 年前
        1
  •  3
  •   Carl G    12 年前

    我不想在这里声明特定的知识,但是在变量赋值和使用值作为方法参数之间有一个明显的区别:只有一个 可能的 前一种情况下的目标,无论方法是否重载。

    基本上,这意味着您不必担心类型推断和重载/转换交互:推断 只有 发生在你知道你唯一感兴趣的目标类型的情况下。

    这个 不过只是猜测一下。我一直发现Java的类型推理很有趣,它的工作方式与C 3完全相反,在这里你可以推断出 变量的 类型(只要是局部变量)。

    编辑:我相信相关 JLS section is 15.12.2.8 :

    如果方法结果出现在 受其约束的上下文 转让转换(_§5.2)为类型 s,那么r是声明的结果。 方法的类型[…]

    基本上是“赋值转换”位,这很重要。