< T > (尖括号)在 Java 中是什么意思?

我目前正在学习 Java,最近被尖括号(< >)难住了。它们到底是什么意思?

public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects = new ArrayList<T>(maxsize)
}

<T>是什么意思? 它是否意味着我可以创建一个类型为 T的对象?

178646 次浏览

在 Java 中,<>用于指示 非专利药

T是此示例中的类型参数。实例化是 不行T做的少数几件事情之一。

除了上面链接的教程之外,Angelika Langers 常见问题解答是关于这个主题的一个很好的资源。

可以像下面这样实例化一个对象 Pool:

PoolFactory<Integer> pool = new Pool<Integer>();

泛型参数只能是引用类型。所以不能使用像 int、 double、 char 或其他基元类型这样的基元类型。

<T>一般,通常可以读作“类型 T”。它取决于 < > 左边的类型它实际上是什么意思。

我不知道什么是 Pool或者 PoolFactory,但是你们也提到了 ArrayList<T>,它是一个标准的 Java 类,所以我会谈到它。

通常,你不会看到“ T”在那里,你会看到另一种类型。所以如果你看到例如 ArrayList<Integer>,这意味着“ ArrayListInteger。”许多类使用泛型来约束容器中元素的类型,例如。另一个例子是 HashMap<String, Integer>,意思是“具有 String键和 Integer值的映射”

您的 Pool 示例有点不同,因为这里是 定义类。因此,在这种情况下,您正在创建一个类,其他人可以用一个特定的类型代替 T 来实例化它。例如,我可以使用您的类定义创建一个类型为 Pool<String>的对象。这意味着两件事:

  • 我的 Pool<String>将有一个带有返回 StringcreateObject方法的接口 PoolFactory<String>
  • 在内部,Pool<String>将包含字符串的 ArrayList

这是一个好消息,因为在另一个时间,我可以来创建一个 Pool<Integer>,它将使用相同的代码,但有 Integer无论你在源代码中看到 T

这和 Java的类型擦除有关。如果我提到了 ArrayList<String>,那就意味着我只能将 String 类型的对象添加到数组列表中。

Java的类型擦除的两大好处是:

  1. 减少程序中的强制转换数量,从而减少程序中潜在的错误数量。
  2. 提高代码清晰度

泛型类是在创建数据类型时将其作为参数接受的类型。使用尖括号指定此类型参数,并且每次实例化类的新实例时,该类型都可以更改。例如,让我们为 Employee 对象创建一个 ArrayList,为 Company 对象创建另一个 ArrayList

ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();

您会注意到,我们使用相同的 ArrayList 类来创建这两个列表,并使用尖括号传入 Employee 或 Company 类型。使用一个泛型类能够处理多种类型的数据,可以减少执行类似任务的类的数量。 泛型还有助于减少 bug,因为它为所有内容提供强类型,从而帮助编译器指出错误。通过为 ArrayList 指定类型,如果您试图将 Employee 添加到 Company 列表中,编译器将抛出错误,反之亦然。

很简单。这是 J2SE 5中引入的一个新特性。在类名称后面指定角括号意味着您正在创建一个临时数据类型,该类型可以包含任何类型的数据。

例如:

class A<T>{
T obj;
void add(T obj){
this.obj=obj;
}
T get(){
return obj;
}
}
public class generics {
static<E> void print(E[] elements){
for(E element:elements){
System.out.println(element);
}
}


public static void main(String[] args) {
A<String> obj=new A<String>();
A<Integer> obj1=new A<Integer>();
obj.add("hello");
obj1.add(6);
System.out.println(obj.get());
System.out.println(obj1.get());


Integer[] arr={1,3,5,7};
print(arr);
}
}

<T>不同,您可以实际编写任何内容,并且它的工作方式也是一样的。尝试写 <ABC>代替 <T>

这只是为了方便:

  • <T>被称为任何类型
  • 作为元素类型的 <E>
  • <N>作为数字类型
  • 值为 <V>
  • <K>作为钥匙

但你可以给它起任何名字,无所谓。

此外,IntegerStringBoolean等都是 Java 的包装类,有助于在编译过程中检查类型。例如,在上面的代码中,obj的类型为 String,因此不能向其添加任何其他类型(请尝试 obj.add(1),它将强制转换错误)。类似地,obj1Integer类型,您不能向它添加任何其他类型(请尝试 obj1.add("hello"),错误将出现)。