问题
我目前正在学习Java,最近被尖括号(<>)困扰了。他们究竟是什么意思?
public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects= new ArrayList<T>(maxsize)
}
<T>
是什么意思?这是否意味着我可以创建一个类型为T
的对象?
#1 热门回答(111 赞)
<T>
是ageneric,通常可以读作"T型"。它取决于<>左边的类型实际意味着什么。
我不知道aPool
或PoolFactory
是什么,但你也提到ArrayList<T>
,这是一个标准的Java类,所以我会谈到它。
通常,你不会看到"T",你会看到另一种类型。因此,如果你看到例如ArrayList<Integer>
,那就意味着"AnArrayList
ofInteger
s"。例如,许多类使用泛型来约束容器中元素的类型。另一个例子是HashMap<String, Integer>
,意思是"带有String
keys和Integer
值的 Map "。
你的游泳池示例有点不同,因为你正在定义一个类。因此,在这种情况下,你正在创建一个其他人可以用特定类型代替T进行实例化的类。例如,我可以使用你的类定义创建类型为Pool<String>
的对象。这意味着两件事:
- 我的池<String>将有一个接口PoolFactory <String>,其中包含一个返回字符串的createObject方法。
- 在内部,Pool <String>将包含字符串的ArrayList。
这是一个好消息,因为在另一个时间,我可以来创建一个使用相同代码的aPool<Integer>
,但无论你在源头看到5334114035,都有Integer
。
#2 热门回答(19 赞)
它与java中的泛型有关。如果我提到ArrayList<String>
这意味着我只能将String类型对象添加到该ArrayList。
Java中泛型的两个主要好处是:-减少程序中的强制转换数量,从而减少程序中潜在错误的数量。
- 提高代码清晰度
#3 热门回答(15 赞)
这很简单。这是在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>作为关键
但你可以将它命名为任何你想要的东西,这并不重要。
此外,Integer
,String
,Boolean
etc是Java的包装类,它有助于在编译期间检查类型。例如,在上面的代码中,obj
的类型为String
,因此你无法向其添加任何其他类型(tryobj.add(1)
,它将转换错误)。类似地,16422122是Integer
type,你不能添加任何其他类型(tryobj1.add("hello")
,错误将在那里)。