我目前正在学习Java,并且最近被尖括号(<>)所困扰。他们究竟是什么意思?
public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects= new ArrayList<T>(maxsize)
}
<T>
是什么意思?这是否意味着我可以创建T
类型的对象?
答案 0 :(得分:129)
<T>
是泛型,通常可以读作“T型”。它取决于&lt;&gt;左侧的类型实际意味着什么。
我不知道Pool
或PoolFactory
是什么,但你也提到ArrayList<T>
,这是一个标准的Java类,所以我会谈谈。
通常,你不会看到“T”,你会看到另一种类型。因此,如果您看到ArrayList<Integer>
,则表示“ArrayList
Integer
。”例如,许多类使用泛型来约束容器中元素的类型。另一个示例是HashMap<String, Integer>
,表示“带有String
键和Integer
值的地图。”
您的Pool示例略有不同,因为您定义类。因此,在这种情况下,您正在创建一个其他人可以用特定类型代替T进行实例化的类。例如,我可以使用您的类定义创建类型为Pool<String>
的对象。这意味着两件事:
Pool<String>
将有一个PoolFactory<String>
接口,其createObject
方法会返回String
个。Pool<String>
将包含ArrayList
个字符串。这是一个好消息,因为在另一个时间,我可以来创建一个使用相同代码的Pool<Integer>
,但在源代码中只有Integer
T
答案 1 :(得分:20)
它与java中的泛型有关。如果我提到ArrayList<String>
这意味着我只能将String类型对象添加到该ArrayList。
Java中泛型的两个主要好处是:
答案 2 :(得分:18)
这很简单。它是 J2SE 5 中引入的新功能。在类名后面指定尖括号意味着您正在创建一个可以保存任何类型数据的临时数据类型。
示例:
date_time
而不是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
等是Java的包装类,有助于在编译期间检查类型。例如,在上面的代码中,Boolean
的类型为obj
,因此您无法向其中添加任何其他类型(尝试String
,它会产生错误)。同样,obj.add(1)
属于obj1
类型,您无法为其添加任何其他类型(尝试Integer
,错误就在那里)。
答案 3 :(得分:9)
称为泛型类型。您可以像这样实例化对象池:
PoolFactory<Integer> pool = new Pool<Integer>();
泛型参数只能是引用类型。因此,您不能使用原始类型,如int或double或char或其他原始类型。
答案 4 :(得分:6)
<>
用于表示Java中的generics。
T
是此示例中的类型参数。不,实例化是不能对T
做的少数事情之一。
除了上面链接的教程Angelika Langers Generics FAQ之外,该主题还是一个很好的资源。
答案 5 :(得分:5)
泛型类是一种类,它在创建时将数据类型作为参数接收。此类型参数使用尖括号指定,并且每次实例化类的新实例时类型都可以更改。例如,让我们为Employee对象创建一个ArrayList,为Company对象创建另一个
ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();
您会注意到我们使用相同的ArrayList类来创建两个列表,我们使用尖括号传递Employee或Company类型。让一个通用类能够处理多种类型的数据减少了许多执行类似任务的类。 泛型还通过提供一个强大的类型来帮助编译器指出错误,从而帮助减少错误。通过为ArrayList指定类型,如果您尝试将Employee添加到Company列表,编译器将抛出错误,反之亦然。