Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Java8-为期望泛型类型的方法提供原始类型参数会导致其返回类型被擦除_Java_Generics_Java 8 - Fatal编程技术网

Java8-为期望泛型类型的方法提供原始类型参数会导致其返回类型被擦除

Java8-为期望泛型类型的方法提供原始类型参数会导致其返回类型被擦除,java,generics,java-8,Java,Generics,Java 8,以下示例在Java7中编译成功,但在Java8(及更新版本)中编译失败 Java 8: > Task :compileJava FAILED C:\dev\projects\Java8\src\main\java\example\Example.java:10: error: incompatible types: Object cannot be converted to T return method(new HashMap());

以下示例在Java7中编译成功,但在Java8(及更新版本)中编译失败

Java 8:

> Task :compileJava FAILED
C:\dev\projects\Java8\src\main\java\example\Example.java:10: error: incompatible types: Object cannot be converted to T
        return method(new HashMap());
                     ^
  where T is a type-variable:
    T extends Object declared in class Example
上面的错误意味着
方法(new HashMap())
返回了
对象,而不是预期的
T

为了避免Java 8中出现此错误,我必须提供泛型类型参数,即将
new HashMap()
更改为
new HashMap()

令人不安的是,传递给
method(Map)
的原始类型参数导致的错误实际上是该方法返回
Object
而不是
T
。因此,我可以预期:

T result = method(new HashMap<>());
如果在需要泛型类型参数的地方提供了非泛型类型参数,那么突然忘记方法返回的参数化类型似乎不是直观的行为。它只是方法定义中的参数上下文,我希望它与同一方法定义中的返回类型上下文隔离

这种行为是否有正当理由和适用的解释?我知道在Java8中所做的更改会影响泛型,但与此特定情况不匹配


谢谢您的回答。

我真的找不到java-7的问题(我将尝试更多),但这似乎是通过以下方式指定的:

未从其超类或超接口继承的原始类型C的构造函数(§8.8)、实例方法(§8.4,§9.4)或非静态字段(§8.3)M的类型是对应于在对应于C的泛型声明中删除其类型的原始类型

我想是这个,因为我在原始类型下找不到更好的解释。或者,简单地说,一旦您使用了原始类型,其他所有东西(即使是不相关的东西)也将使用擦除类型

15.12.2.6。方法结果和抛出类型

所选方法的结果类型确定如下:

[…]如果要创建该方法,必须进行未经检查的转换 如果适用,则结果类型为该方法数据的擦除(§4.6) 声明的返回类型。[……]

它是在中国长大的

如果我将其设置为
公共抽象类示例
,那么我将得到
错误:不兼容类型:异常无法转换为T



(我似乎又一次在一天内找不到答案,详细阐述了一个很长的问题,发布后很快就能找到答案。)

这看起来确实像是7中的错误,8中修复了。而且编译器也不会抱怨原始类型的HashMap——它会抱怨,通过warningOk,我希望我已经澄清了这一部分,指出错误,而不是指出任何与警告相关的语句。事情是——一旦你使用了原始类型——其他的一切都是泛型的擦除类型。我正在浏览JLS中的确切单词…感谢您的发现。事实上,我发现了问题所在。JLS定义方法结果类型的另一部分也提到了相同的行为。请看下面我的答案。@CodeSculptor不错!你可以在几天内自由地接受你自己的答案
> Task :compileJava FAILED
C:\dev\projects\Java8\src\main\java\example\Example.java:10: error: incompatible types: Object cannot be converted to T
        return method(new HashMap());
                     ^
  where T is a type-variable:
    T extends Object declared in class Example
T result = method(new HashMap<>());
Object result = method(new HashMap());