解释集合的语法.<String> emptyList()

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)
  1. 什么是Collections?为什么不是Collections<E>还是Collections<String>
  2. 为什么<String>放在方法名称之前emptyList

(emptyList<String>()Generic 不正确吗?)

  1. 该陈述是什么意思?

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)

我们可以调用它的构造,其中AStringBInteger这样的:

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)

也可以看看:

  • 我检查了构造函数的语法,结果是构造函数也可以拥有自己的类型参数,因此我们可以使用包含两个类型参数表达式的语法,如`new <String> MyClass <Integer>(2)`. (9认同)
  • 可能要提一下`Collections`是那些只用*来提供静态方法的类之一; 它本身并不打算实例化(反过来也不能). (4认同)

Sot*_*lis 11

什么是Collections?为什么不是Collections<E>还是Collections<String>

Collections 是一个JDK类.

此类仅包含对集合进行操作或返回集合的静态方法.它包含对集合进行操作的多态算法,"包装器",它返回由指定集合支持的新集合,以及其他一些可能的结果.

它不是通用的,无法实例化.

为什么<String>放在方法名称之前emptyList

Collections#emptyList是一种通用方法.在这里,我们明确指定了一个类型参数String.

(emptyList<String>()Generic 不正确吗?)

不,在Java中,方法的泛型类型参数位于方法名称之前.

该陈述是什么意思?

我们正在调用静态emptyList方法并将其返回值赋给类型的变量List<String>.


NPE*_*NPE 9

简而言之,这会创建一个空的,不可变的字符串列表.

让我们一点一点地看一下表达式.

Collections是一个类的名称.来自Javadoc:

此类仅包含对集合进行操作或返回集合的静态方法.它包含对集合进行操作的多态算法,"包装器",它返回由指定集合支持的新集合,以及其他一些可能的结果.

emptyList()Collections类(Javadoc)中定义的静态方法的名称.它是一个泛型方法,<String>in Collections.<String>emptyList()指定泛型类型参数.

该方法返回a List<T>,在本例中为List<String>:字符串列表.更具体地说,它返回一个空的,不可变的字符串列表.


Leo*_*Leo 6

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之间的区别

  • `表示只能将String值添加到它.更准确的描述是:它将方法的参数类型声明为String,以便返回值是同类的String列表. (2认同)

Qix*_*Qix 6

首先,Collections是一个静态方法的辅助库,可以对各种类型的集合进行操作.如果您已经完成了任何类型的C++编程,那么它就是<algorithm>函数库的同义词.

在这种情况下,您将调用静态方法emptyList(),该方法返回特定类型的空列表.由于这些方法仍然需要类型,但Collections'方法可以引用许多类型,您必须在调用时指定类型.

为了调用泛型方法,必须在方法名称之前使用参数列表(即<String>)调用它,但是点之后.

List<String> someList = Collections.<String>emptyList();
Run Code Online (Sandbox Code Playgroud)