![](/img/trans.png)
[英]What does a tilde in angle brackets mean when creating a Java generic class?
[英]What does <T> (angle brackets) mean in Java?
我目前正在研究 Java,最近被尖括号(<>)难住了。 它们到底是什么意思?
public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects = new ArrayList<T>(maxsize)
}
<T>
是什么意思? 这是否意味着我可以创建T
类型的 object ?
<T>
是一个泛型,通常可以理解为“T 型”。 这取决于 <> 左侧的类型,它的实际含义是什么。
我不知道Pool
或PoolFactory
是什么,但您也提到了ArrayList<T>
,它是标准的 Java class,所以我会谈谈。
通常,你不会在那里看到“T”,你会看到另一种类型。 因此,例如,如果您看到ArrayList<Integer>
,则表示“ ArrayList
s 的Integer
”。 例如,许多类使用 generics 来约束容器中元素的类型。 另一个例子是HashMap<String, Integer>
,意思是“带有String
键和Integer
值的 map”。
您的 Pool 示例有点不同,因为您正在定义class。 因此,在这种情况下,您正在创建一个 class,其他人可以用特定类型代替 T 进行实例化。例如,我可以使用您的 class 定义创建一个Pool<String>
类型的 object。 这意味着两件事:
Pool<String>
将有一个接口PoolFactory<String>
和一个返回String
的createObject
方法。Pool<String>
将包含一个ArrayList
字符串。 这是个好消息,因为在另一个时候,我可以来创建一个Pool<Integer>
,它将使用相同的代码,但在源代码中看到T
的任何地方都有Integer
。
这真的很简单。 这是J2SE 5中引入的一个新特性。 在 class 名称之后指定 angular 括号意味着您正在创建一个可以保存任何类型数据的临时数据类型。
例子:
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>
作为键但是你可以给它起任何你想要的名字,这并不重要。
此外, Integer
、 String
、 Boolean
等是 Java 的包装类,它们有助于在编译期间检查类型。 例如,在上面的代码中, obj
是String
类型,所以你不能向它添加任何其他类型(尝试obj.add(1)
,它会抛出错误)。 同样, obj1
属于Integer
类型,您不能向其添加任何其他类型(尝试obj1.add("hello")
,会出现错误)。
与java中的generics相关。 如果我提到ArrayList<String>
这意味着我只能将字符串类型 object 添加到 ArrayList。
Java中的generics的两大好处是:
被称为泛型类型。 您可以像这样实例化 object 池:
PoolFactory<Integer> pool = new Pool<Integer>();
泛型参数只能是引用类型。 所以你不能使用原始类型,如 int 或 double 或 char 或其他原始类型。
<>
用于表示Java中的generics。
T
在本例中是一个类型参数。 不:实例化是你不能用T
做的少数事情之一。
除了上面链接的教程之外, Angelika Langers Generics FAQ是关于该主题的一个很好的资源。
泛型类是 class 的一种类型,它在创建时接受数据类型作为参数。 此类型参数使用尖括号指定,并且每次实例化 class 的新实例时,类型都会更改。 例如,让我们为 Employee 对象和 Company 对象创建一个 ArrayList
ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();
您会注意到我们使用相同的 ArrayList class 创建两个列表,并且我们使用尖括号传入 Employee 或 Company 类型。 拥有一个通用的 class 能够处理多种类型的数据,从而减少了拥有许多执行类似任务的类。 Generics 还通过为所有内容提供强类型来帮助减少错误,这有助于编译器指出错误。 通过为 ArrayList 指定类型,如果您尝试将员工添加到公司列表,编译器将抛出错误,反之亦然。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.