作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我发现了一个“不寻常”的通用语法,例如:
Arrays.<String>asList(...);
Collections.<String>emptyList();
显然,方法的结果是通用的。这种语法是用于类型检查的吗?一个 Object
数组不能是 Arrays.<String>asList(...)
的参数.
最佳答案
<typearg>methodname
是显式指定泛型方法的类型参数的语法
当您使用泛型类时,通常必须指定类型参数(例如 String
):
ArrayList<String> list = new ArrayList<String>();
使用泛型方法,您通常不会传递类型参数:
public static <T> void foo(T param) { }
...
String s = ...;
MyClass.foo(s);
你会注意到我们没有在哪里明确指定我们想要 String
的代码。 foo
的版本,即没有显式类型参数 <String>
就像我们在使用泛型类 ( List<String>
) 时看到的那样指定。
编译器正在使用一些编译器魔法来根据上下文推断泛型类型参数。这是一件很棒的事情,而且非常强大。
但是,有时编译器无法自动推断类型参数:
public static <T> void bar() { T myLocalVar = ...; ... }
MyClass.bar();
bar
的具体版本是什么?我们是否试图调用,即这个调用的类型参数是什么?好吧,编译器也没有。我们必须显式声明类型参数,就像我们通常在使用泛型类时所做的那样:
MyClass.<String>bar();
另见:
除此之外: 值得一提的是,Java 7 将添加所谓的菱形运算符,以便我们现在也可以让编译器在使用泛型类时推断类型参数:
ArrayList<String> list = new ArrayList<String>();
变成
ArrayList<String> list = new ArrayList<>();
关于java - 不寻常的通用语法 : Arrays. <String>asList(...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4829631/
我是一名优秀的程序员,十分优秀!