我只是从教科书中学习Java中的泛型,它讲的是用ng-options="data.id as data.title for data in {{$column.data}}"
实现的类GenericStack<E>
。
因为要创建一堆字符串,所以使用
ArrayList<E>
或
GenericStack<String> = new GenericStack<String>()
因此,不应该是构造函数
GenericStack<String> new GenericStack<>()
被定义为GenericStack
或public GenericStack<E>()
?答案是不。它应该定义为public GenericStack<>()
。
这是为什么?显然,构造函数可以很容易地从类声明中推断出类型,但考虑到Java的冗长,我有点迷惑为什么public GenericStack()
或简单地<E>
形式主义完全摆脱了这里。
答案 0 :(得分:7)
这有两个部分:
类定义的泛型类型参数在类本身中可用。
您可以拥有特定于各个方法的通用类型(包括构造函数)。
请看以下示例:
package snippet;
import java.util.ArrayList;
public class Y<E> extends ArrayList<E> {
public <T> Y(T t) {
}
}
如果类E
可用于整个类,则类型T
仅在构造函数中有效。
答案 1 :(得分:1)
您将方法的声明与其调用站点(即您使用它的位置)混淆。如果您想使用在课堂上声明的通用,只需在呼叫站点提供<E>
或<>
- 而不是声明。在这方面,构造函数与任何其他方法一样被声明:
public GenericStack<E> {
public E get() { ... // correct
public <E> put(E element) { ... // bad (see below)
public GenericStack() { ... // correct, like the get()
重新声明通用(如上面的put
情况)实际阴影它; E
中的put(E)
实际上与E
中的GenericStack<E>
不同,尽管名称相同。这很令人困惑,你应该避免这样做。
答案 2 :(得分:1)
类和构造函数都可以是通用的,即每个类都有自己的类型参数。例如
new <String>A<Integer>("abc"); // T=Integer, S=String
使用所有显式类型参数调用构造函数
A<Integer>
可以这样想,<String>A
是具体的类,new A<Integer>("abc"); // S=String is inferred
是具体的构造函数。
由于类型推断,我们可以省略构造函数的类型参数
<>
该类的类型参数也可以通过&#34; diamond&#34;来省略和推断。 (A<Integer> a = new A<>("abc"); // T=Integer is inferred, as well as S=String
)语法
setEnabled(boolean value)
我写了一篇关于这个主题的(长篇)帖子 - https://stackoverflow.com/a/32292707/2158288