Jen*_*nix 70 java generics collections
我刚学习了泛型编程,List<E>界面ArrayList,所以我可以理解下面的陈述.
ArrayList<String> list = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
但我不明白我在浏览网页时看到的下一个陈述.
List<String> list2 = Collections.<String>emptyList();
Run Code Online (Sandbox Code Playgroud)
Collections?为什么不是Collections<E>还是Collections<String>?<String>放在方法名称之前emptyList?(emptyList<String>()Generic 不正确吗?)
fgb*_*fgb 58
该行通过使用泛型类型参数调用静态方法来创建一个空字符串列表.
在Collections类中,有一个静态方法emptyList声明如下:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Run Code Online (Sandbox Code Playgroud)
这有一个泛型类型参数T.我们使用以下方法调用此方法:
List<String> list = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)
因为它的类型而T被推测为.Stringlist
我们还可以T在调用时将其放在尖括号中来指定类型emptyList.如果我们想要比推断的更具体的类型,则可能需要这样做:
List<? extends Object> list = Collections.<String>emptyList();
Run Code Online (Sandbox Code Playgroud)
emptyList<String>()是不正确的,因为该放置仅在创建泛型类的实例时有效,而不是调用方法.使用时new有两种可能的类型参数,类名前的那些参数仅用于构造函数,类名后面的那些参数用于整个实例,因此使用类:
class MyClass<A> {
public <B> MyClass(A a, B b) {
System.out.println(a + ", " + b);
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以调用它的构造,其中A是String和B是Integer这样的:
MyClass<String> a = new <Integer>MyClass<String>("a", 3);
Run Code Online (Sandbox Code Playgroud)
或者使用类型推断:
MyClass<String> a = new MyClass<>("a", 3);
Run Code Online (Sandbox Code Playgroud)
也可以看看:
Sot*_*lis 11
什么是
Collections?为什么不是Collections<E>还是Collections<String>?
Collections 是一个JDK类.
此类仅包含对集合进行操作或返回集合的静态方法.它包含对集合进行操作的多态算法,"包装器",它返回由指定集合支持的新集合,以及其他一些可能的结果.
它不是通用的,无法实例化.
为什么
<String>放在方法名称之前emptyList?
Collections#emptyList是一种通用方法.在这里,我们明确指定了一个类型参数String.
(
emptyList<String>()Generic 不正确吗?)
不,在Java中,方法的泛型类型参数位于方法名称之前.
该陈述是什么意思?
我们正在调用静态emptyList方法并将其返回值赋给类型的变量List<String>.
简而言之,这会创建一个空的,不可变的字符串列表.
让我们一点一点地看一下表达式.
Collections是一个类的名称.来自Javadoc:
此类仅包含对集合进行操作或返回集合的静态方法.它包含对集合进行操作的多态算法,"包装器",它返回由指定集合支持的新集合,以及其他一些可能的结果.
emptyList()是Collections类(Javadoc)中定义的静态方法的名称.它是一个泛型方法,<String>in Collections.<String>emptyList()指定泛型类型参数.
该方法返回a List<T>,在本例中为List<String>:字符串列表.更具体地说,它返回一个空的,不可变的字符串列表.
1.Collection是一个接口,集合是一个静态类,只包含对集合进行操作或返回集合的静态方法.因此我们不能使用Collections<E>或Collections<String>.
2. <String>before emptyList(用于获取不可变的空列表)表示只能添加String值.喜欢:
list2.add("A");
list2.add("B");
Run Code Online (Sandbox Code Playgroud)
3.该语句意味着它将创建一个List类型的不可变空列表.
您可以查看此链接:Java Collection和Collections之间的区别
首先,Collections是一个静态方法的辅助库,可以对各种类型的集合进行操作.如果您已经完成了任何类型的C++编程,那么它就是<algorithm>函数库的同义词.
在这种情况下,您将调用静态方法emptyList(),该方法返回特定类型的空列表.由于这些方法仍然需要类型,但Collections'方法可以引用许多类型,您必须在调用时指定类型.
为了调用泛型方法,必须在方法名称之前使用参数列表(即<String>)调用它,但是在点之后.
List<String> someList = Collections.<String>emptyList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4786 次 |
| 最近记录: |