当前位置: 首页 > 知识库问答 >
问题:

为什么Java的类型推断如此薄弱?

卫俊力
2023-03-14

说吧,我有一个方法:

public static <T> Collection<T> addToCollection(T element, Collection<T> collection) {
    collection.add(element);
    return collection;
}

然后在尝试编译此代码时:

Integer i = 42;
Collection<Integer> result = addToCollection(i, Collections.emptyList());

我收到错误 类型不匹配:无法从集合转换

上面的例子很明显是人为的,但是我总是偶然发现这个限制,这真的很烦人。在阅读了《有效的Java》之后,我发现你可以简单地进行<代码>收集。

我只是想知道这是否是某种错误,或者是否有任何正当理由让它以这种方式工作?


共有3个答案

从元明
2023-03-14

这样做有什么害处?

Integer i = 42;
List<Integer> emptyList = Collections.emptyList();
Collection<Integer> result = addToCollection(i, emptyList);

在java 8中,它将得到照顾。

马泰
2023-03-14

集合。emptyList()返回列表

田俊爽
2023-03-14

在Java 8中,类型推断系统得到了改进,引入了目标类型,以便为流和lambda提供更多的表达能力。因此,您的代码使用 Java 8 进行编译。

在更新的教程中详细介绍它,页面底部有一个非常相似的示例。

 类似资料:
  • 问题内容: 说,我有一种方法: 然后在尝试编译此代码时: 我得到一个错误。谁能解释为什么类型系统不能推断Collections.emptyList()应该是类型吗? 上面的示例显然是很人为的,但是我一直都在偶然地遇到这种限制,这确实很烦人。阅读了 Effective Java 之后,我发现您可以轻松地完成工作(必须说,当时对我来说是一个启示),并且一切都可以顺利编译,但是当您使用复杂的类型时,确实

  • 问题内容: 我正在使用Java 的本地实现,该实现具有如下方法: 这两种方法可以编译并正常工作: 此方法无法编译: 错误: (我已经修剪了包限定符,以使错误更易读) 我可以通过指定类型进行编译: 但是为什么我需要呢?以及如何避免此代码混乱? 问题答案: 此代码应该起作用。 它在最新的JDK 1.8.0_121上编译。 无法在JDK 1.8.0-51上编译。 这意味着它在此版本的JDK中很可能是一个

  • 问题内容: 我有一个奇怪的场景,在使用lambda表达式时,类型推断无法按预期工作。这是我实际情况的近似值: 我倒数第二行的编译错误是 未为对象类型定义方法booleanValue() 如果我将lambda转换为: 或者如果我将方法签名更改为使用原始类型: 然后问题就解决了。我希望它能起作用的方式是: 调用应推断返回类型为 在lambda中应该推断为。 为什么这种推论不能按预期方式工作?如何更改此

  • 问题内容: 在Java 7和更高版本中,菱形通常可以像这样毫无问题地用于推断类型: 但是,它不能用于这样的匿名内部类: 为什么是这样?从逻辑上讲,在这种情况下,我绝对可以将类型推断为。做出该决定的逻辑上的理由是,实际上不能在匿名内部类上推断类型,还是出于其他原因而将其省略了? 问题答案: 在JSR-334中: 不支持将Diamond与匿名内部类一起使用,因为这样做通常需要扩展类文件签名属性以表示不

  • 看看下面例子中泛型类型的类型推断,我说不出为什么工作得很好,但是(几乎相同)无法编译,为了管理它,编译器需要额外的技巧,比如或。 导致编译器不确定表达式类型和方法结果类型是否兼容的问题是什么?

  • 我使用的是Java中的<code>或者</code>的本地实现,它有如下方法: 这两种方法可以编译并正常工作: 此方法不编译: 错误: (我去掉了包限定符,使错误更加易读) 我可以通过指定类型来编译它: 但我为什么需要这样做?我如何避免这种代码混乱?