Eve*_*Eve 3 java generics declaration
我开始学习Generics了Java,我看几个教程,但我有点迷茫,不知道如何泛型方法声明。
当我使用泛型类型时,定义方法的正确顺序是什么?我找到了这个示例,什么时候需要使用尖括号,什么时候不需要?
public class Box<A> {
private A a;
...
public void setA(A a) {
this.a = a;
}
public <A> List<A> transform(List<A> in) {
return null;
}
public static <A> A getFirstElement(List<A> list) {
return null;
}
public A getA() {
return a;
}
Run Code Online (Sandbox Code Playgroud)
问题是你的代码使用了相同的字符 A,但它在不同的地方有几个不同的“含义”:
public class Box<T> {
Run Code Online (Sandbox Code Playgroud)
需要大括号,因为您在这里说的是:Box 使用了一个泛型类型,称为 T。
T go 不带大括号的用法:
private T a;
public void setA(T a) {
Run Code Online (Sandbox Code Playgroud)
但是之后
public <T2> List<T2> transform(List<T2> in) {
Run Code Online (Sandbox Code Playgroud)
正在引入另一个类型参数。我把它命名为T2,使之清楚,这是不一样的T.的想法是,在范围T2的是唯一的一个方法transform。其他方法不知道T2!
public static <A> A getFirstElement(List<A> list) {
Run Code Online (Sandbox Code Playgroud)
与上面相同 - 此处为“T3”;-)
编辑您的评论:您不能让静态方法使用类范围的类型 T。这根本不可能!看看这里为什么会这样!
编辑 2:泛型允许您编写通用代码(因为它可以处理不同的类);但仍然给你编译时安全。例子:
Box<String> stringBox = new Box<>();
Box<Integer> integerBox = new Box<>();
integerBox.add("string"); // gives a COMPILER error!
Run Code Online (Sandbox Code Playgroud)
在人们有泛型之前,他们只能到处处理Object;和手工铸造。