gpt4 book ai didi

Java 8 - 向需要泛型类型的方法提供原始类型参数会导致其返回类型被删除

转载 作者:行者123 更新时间:2023-11-30 07:47:15 26 4
gpt4 key购买 nike

以下示例在 Java 7 中编译成功,但在 Java 8(及更新版本)中编译失败。

public abstract class Example<T> 
{
public T method()
{
return method(new HashMap());
}

abstract T method(Map<String, String> arg);
}

Java 7:

BUILD SUCCESSFUL in 1s

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

上面的错误意味着method(new HashMap())返回 Object而不是预期的T .

为了避免 Java 8 中的这个错误,我必须提供泛型类型参数,即更改 new HashMap()new HashMap<>() .

令人不安的部分是传递给 method(Map<String, String>) 的原始类型参数引起的错误实际上是关于这个方法返回 Object而不是 T .所以我可以期待:

T result = method(new HashMap<>());

...,但是:

Object result = method(new HashMap());

如果在期望泛型类型参数的地方提供了非泛型类型参数,那么突然忘记参数化类型的方法返回似乎不是直观的行为。它只是方法定义中的一个参数上下文,我希望它与同一方法定义中的返回类型上下文隔离。

这种行为是否有正当理由和适用的解释?我知道影响 Java 8 中的泛型的更改,但没有与此特定情况相符的更改。

感谢您的回答。

最佳答案

JLS, Chapter 15.

15.12.2.6. Method Result and Throws Types

The result type of the chosen method is determined as follows:

[...] if unchecked conversion was necessary for the method to be applicable, then the result type is the erasure (§4.6) of the method's declared return type. [...]

它在 JDK-6791481 中被提出.

如果我能做到public abstract class Example<T extends java.lang.Exception> , 然后我会得到 error: incompatible types: Exception cannot be converted to T .


(又好像得一天找不到答案,细化一个长问题,贴出来,很快就找到答案了。)

关于Java 8 - 向需要泛型类型的方法提供原始类型参数会导致其返回类型被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50008656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com