泛型类型推断不能与方法链接一起使用?

该代码在Java 8中编译,但在Java 7中无法编译:

class Map<K,V> {
    static <K,V> Map<K,V> empty() {return null;}
    Map<K,V> put(K k, V v) {return null;}
    V get(K k) {return null;}
}

class A {
    static void f(Map<Integer,String> m){}
    public static void main(String[] args) {
        f(Map.empty());
    }
}

它不能推断出Map从中返回的具体类型Map.empty()

$ javac7 A.java
A.java:10: error: method f in class A cannot be applied to given types;
        f(Map.empty());
        ^
  required: Map<Integer,String>
  found: Map<Object,Object>
  reason: actual argument Map<Object,Object> cannot be converted to Map<Integer,String> by method invocation conversion
1 error

如果将f调用更改为,它将编译f(Map.<Integer,String>empty());在Java 8中,它可以工作而不必求助于此。

但是,如果将f调用更改f(Map.empty().put(1,"A").put(2,"B"));,它将无法在Java 7和8上再次编译。为什么?

$ $javac7 A.java 
A.java:10: error: method f in class A cannot be applied to given types;
        f(Map.empty().put(1,"A").put(2,"B"));
        ^
  required: Map<Integer,String>
  found: Map<Object,Object>
  reason: actual argument Map<Object,Object> cannot be converted to Map<Integer,String> by method invocation conversion
1 error

$ $javac8 A.java
A.java:10: error: incompatible types: Map<Object,Object> cannot be converted to Map<Integer,String>
        f(Map.empty().put(1,"A").put(2,"B"));
                                    ^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error

$ $javac8 -Xdiags:verbose A.java
A.java:10: error: method f in class A cannot be applied to given types;
        f(Map.empty().put(1,"A").put(2,"B"));
        ^
  required: Map<Integer,String>
  found: Map<Object,Object>
  reason: argument mismatch; Map<Object,Object> cannot be converted to Map<Integer,String>
1 error
贡达德

为什么呢

因为泛型类型的类型推断尚未扩展为链式调用。

有关泛型Java教程中进行类型推断

什么是目标类型的概念已扩展为包括方法参数。

这就是为什么此代码:

f(Map.empty());

编译。

但是,此代码不是因为这是链接调用:

f(Map.empty().put(1,"A").put(2,"B"));

您还可以在JavaTM编程语言最终评估版JSR-000335 Lambda表达式中找到一小段(特别是D部分):

允许推理到“链”已经引起了一些兴趣:在a()。b()中,将类型信息从b的调用传递到a的调用。由于部分信息必须在两个方向上传递,这为推理算法的复杂性增加了另一个维度。它仅在所有实例化(例如List)的a()返回类型的擦除固定时有效。由于无法轻松导出目标类型,因此该功能不太适合多表达式模型。但也许有其他增强功能可以在将来添加。

所以也许在Java 9中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

非泛型方法'ControllerBase.Ok()'不能与类型参数一起使用

来自分类Dev

非泛型方法'HttpClient.GetAsync(string)'不能与类型参数一起使用

来自分类Dev

意外的“非泛型类型不能与类型参数一起使用”?

来自分类Dev

非泛型类型'System.Collections.ArrayList'不能与类型参数一起使用

来自分类Dev

非泛型类型'DelegateCommand'不能与类型参数一起使用

来自分类Dev

非泛型类型字段不能与类型参数一起使用

来自分类Dev

在这种情况下,非泛型方法不能与类型参数一起使用的含义是什么?

来自分类Dev

Unity CS0308错误:非泛型方法不能与类型参数一起使用

来自分类Dev

快速扩展MutableCollectionType不能与泛型类型的数组一起使用

来自分类Dev

编译错误:CS0308 非泛型类型“PermissionChecker”不能与类型参数一起使用

来自分类Dev

类型推断如何与重载泛型方法一起工作

来自分类Dev

如何将Swift协议与泛型方法和泛型类型一起使用

来自分类Dev

BCE0051:运算符“ <”不能与类型“对象”的左侧和类型“浮点型”的右侧一起使用

来自分类Dev

变量的值模型是否只能与静态类型一起使用,而不能与动态类型一起使用?

来自分类Dev

将联合类型与泛型一起使用

来自分类Dev

在将泛型引用类型与泛型类型一起使用时收到警告

来自分类Dev

引用特定类型的任意对象的实例方法...不能与自定义类一起使用?

来自分类Dev

用户定义的类型防护不能与“ any”类型一起使用吗?

来自分类Dev

Kotlin:无法与泛型一起使用的方法

来自分类Dev

Kotlin:无法与泛型一起使用的方法

来自分类Dev

在属性中使用类型参数的解决方法,以将ProducesResponseType与泛型类型参数一起使用?

来自分类Dev

上下文类型“ AnyObject”不能与数组文字一起使用

来自分类Dev

上下文类型'AnyObject'不能与字典文字一起使用吗?

来自分类Dev

Swift:上下文类型“ AnyObject”不能与字典文字一起使用

来自分类Dev

为什么stackalloc不能与引用类型一起使用?

来自分类Dev

为什么类型转换不能与$一起正常使用。在Ruby中?

来自分类Dev

Swift 3 上下文类型“AnyObject”不能与字典文字一起使用

来自分类Dev

UIBezierPath不能与applyTransform方法一起旋转

来自分类Dev

C# 有没有办法将 DllImport 与泛型方法类型一起使用?

Related 相关文章

  1. 1

    非泛型方法'ControllerBase.Ok()'不能与类型参数一起使用

  2. 2

    非泛型方法'HttpClient.GetAsync(string)'不能与类型参数一起使用

  3. 3

    意外的“非泛型类型不能与类型参数一起使用”?

  4. 4

    非泛型类型'System.Collections.ArrayList'不能与类型参数一起使用

  5. 5

    非泛型类型'DelegateCommand'不能与类型参数一起使用

  6. 6

    非泛型类型字段不能与类型参数一起使用

  7. 7

    在这种情况下,非泛型方法不能与类型参数一起使用的含义是什么?

  8. 8

    Unity CS0308错误:非泛型方法不能与类型参数一起使用

  9. 9

    快速扩展MutableCollectionType不能与泛型类型的数组一起使用

  10. 10

    编译错误:CS0308 非泛型类型“PermissionChecker”不能与类型参数一起使用

  11. 11

    类型推断如何与重载泛型方法一起工作

  12. 12

    如何将Swift协议与泛型方法和泛型类型一起使用

  13. 13

    BCE0051:运算符“ <”不能与类型“对象”的左侧和类型“浮点型”的右侧一起使用

  14. 14

    变量的值模型是否只能与静态类型一起使用,而不能与动态类型一起使用?

  15. 15

    将联合类型与泛型一起使用

  16. 16

    在将泛型引用类型与泛型类型一起使用时收到警告

  17. 17

    引用特定类型的任意对象的实例方法...不能与自定义类一起使用?

  18. 18

    用户定义的类型防护不能与“ any”类型一起使用吗?

  19. 19

    Kotlin:无法与泛型一起使用的方法

  20. 20

    Kotlin:无法与泛型一起使用的方法

  21. 21

    在属性中使用类型参数的解决方法,以将ProducesResponseType与泛型类型参数一起使用?

  22. 22

    上下文类型“ AnyObject”不能与数组文字一起使用

  23. 23

    上下文类型'AnyObject'不能与字典文字一起使用吗?

  24. 24

    Swift:上下文类型“ AnyObject”不能与字典文字一起使用

  25. 25

    为什么stackalloc不能与引用类型一起使用?

  26. 26

    为什么类型转换不能与$一起正常使用。在Ruby中?

  27. 27

    Swift 3 上下文类型“AnyObject”不能与字典文字一起使用

  28. 28

    UIBezierPath不能与applyTransform方法一起旋转

  29. 29

    C# 有没有办法将 DllImport 与泛型方法类型一起使用?

热门标签

归档