Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么JDK Map.get不支持对返回值进行类型推断_Java_Generics_Casting_Type Inference - Fatal编程技术网

Java 为什么JDK Map.get不支持对返回值进行类型推断

Java 为什么JDK Map.get不支持对返回值进行类型推断,java,generics,casting,type-inference,Java,Generics,Casting,Type Inference,作为后续问题,为什么JDK 6和7Map接口不将“get”方法定义为泛型方法,以便编译器可以对返回值使用类型推断 例如,如果“get”定义为: publictget(对象键) 然后调用方可以写入: Map m=newhashmap(); m、 put(“key”,newfoo()); ... Foo f=m.get(“key”);//类型推断,隐式转换 在上面的代码片段中,我可以将m定义为Map,但请注意,在许多情况下,将m定义为Map而不是Map是有用的,例如m可以包含任何类型的值,但值类

作为后续问题,为什么JDK 6和7
Map
接口不将“get”方法定义为泛型方法,以便编译器可以对返回值使用类型推断

例如,如果“get”定义为:

publictget(对象键)
然后调用方可以写入:

Map m=newhashmap();
m、 put(“key”,newfoo());
...
Foo f=m.get(“key”);//类型推断,隐式转换

在上面的代码片段中,我可以将m定义为
Map
,但请注意,在许多情况下,将m定义为
Map
而不是
Map
是有用的,例如m可以包含任何类型的值,但值类型仍然可以根据键(例如简单的缓存或上下文对象)进行推断。

,因为它不是(通常)这样做是安全的。
映射
明确声明其值可以是任何类型的
对象
,而不仅仅是
Foo
,因此在典型用法中,不应将其值分配给任何其他对象。这样做通常会导致程序员错误,类型系统应该(并且确实如此)帮助您避免。如果您想做类似的事情,总是会有强制转换,这会使您的意图变得明确。

在这种特定情况下,编译器会尝试警告您不安全的操作,并且隐式转换到您所需的任何内容都是不安全的。您需要显式转换来向开发人员显示“知道”你期望什么类型的人

Java不支持对任何返回类型进行类型推断。它确定方法或表达式的返回类型,赋值可能执行隐式转换


我所看到的唯一例外是MethodHandle.invokeExact()添加到Java 7中,并由JVM进行特殊处理。这是一个新特性,并非在所有情况下都能工作。

这不是同样的问题吗?你链接到的问题的答案不也是这个吗?如果没有,请具体说明。(我最初的反应是投票决定以复制品的形式结束……)不,一点都不一样。到目前为止,这个问题已经明确说明了区别,但重申一下:我不是在问为什么key是Object类型的——这在引用的问题中得到了回答。我想把get定义为一种类型的通用方法,这显然是不同的。这也是我的想法。除了强制转换之外,另一种方法是为程序员知道这样做是安全的特定情况创建不同的接口。例如,缓存或上下文接口可以使用通用方法签名来避免不必要的强制转换,但由于Map是一个更通用的接口,所以不做任何不必要的假设是有意义的。