鉴于此通用功能:
<T> List<T> function() { return null; }
Run Code Online (Sandbox Code Playgroud)
为什么这会编译
List<String> l = function();
Run Code Online (Sandbox Code Playgroud)
虽然这不?
List<String> l = (List<String>) function();
Run Code Online (Sandbox Code Playgroud)
因为你做这样的演员:
(List<String>) function()
Run Code Online (Sandbox Code Playgroud)
编译器不能推断该类型参数function()
调用,并倒在绑定T
到Object
.
而在
List<String> l = function();
Run Code Online (Sandbox Code Playgroud)
它可以推断出正确的类型T
.
请注意,您可能会如果通过显式地提供类型规避类型推断的工作投:
import java.util.List;
class Test {
public static <T> List<T> function() { return null; }
public static void main(String[] args) {
List<String> l = (List<String>) Test.<String>function();
// ^^^^^^^^^^^^^
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道通用参数的确切类型推理规则.然而,它们在JLS第15.12.2.7节中规定.