Java中的<>(尖括号)是什么意思?
我目前正在学习Java,最近被尖括号(<>)难倒了。 他们究竟是什么意思?
public class Pool<T>{ public interface PoolFactory<T>{ public T createObject(); } this.freeObjects= new ArrayList<T>(maxsize) }
<T>
是什么意思? 这是否意味着我可以创build一个T
types的对象?
<T>
是一个通用的 ,通常可以理解为“T型”。 它取决于<>的实际意义左边的types。
我不知道Pool
或者PoolFactory
是什么,但是你也提到了ArrayList<T>
,它是一个标准的Java类,所以我会和你谈谈。
通常情况下,你不会看到“T”,你会看到另一种types。 所以如果你看到ArrayList<Integer>
,那就意味着“ Integer
的ArrayList
”。 例如,许多类使用generics来约束容器中元素的types。 另一个例子是HashMap<String, Integer>
,意思是“一个带有String
键和Integer
值的映射表”。
您的Pool示例有点不同,因为您正在定义一个类。 所以在这种情况下,你正在创build一个类,其他人可以使用特定的types来实例化T。例如,我可以使用你的类定义创build一个types为Pool<String>
的对象。 这将意味着两件事情:
- 我的
Pool<String>
将有一个接口PoolFactory<String>
与一个createObject
方法返回String
s。 - 在内部,
Pool<String>
将包含一个Pool<String>
的ArrayList
。
这是一个好消息,因为在另一个时候,我可以创build一个Pool<Integer>
来使用相同的代码,但是在源代码中只要有T
就可以使用Integer
。
它与java中的generics有关。 如果我提到ArrayList<String>
,这意味着我只能将Stringtypes对象添加到该ArrayList。
Java中generics的两个主要优点是:
- 减less程序中的强制转换次数,从而减less程序中潜在的错误数量。
- 改善代码清晰度
这很简单。 这是J2SE 5中引入的新function。 在类名后面指定尖括号意味着您正在创build一个可以容纳任何types数据的临时数据types。
例:
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>
被称为任何types -
<E>
作为元素types -
<N>
为数字types - 作为价值
-
<K>
作为关键
但是,你可以任何你想要的名字,这并不重要。
此外, Integer
, String
, Boolean
等是Java的包装类,这有助于在编译期间检查types。 例如,在上面的代码中, obj
是String
types的,所以你不能添加任何其他的types(尝试obj.add(1)
,它会投出错误)。 类似的, obj1
是Integer
types,你不能添加任何其他types(尝试obj1.add("hello")
,错误将在那里)。
被称为genericstypes。 你可以像这样实例化一个对象池:
PoolFactory<Integer> pool = new Pool<Integer>();
generics参数只能是引用types。 所以你不能使用像int或double或char或其他基本types的基本types。
<>
用于表示Java中的generics 。
T
是这个例子中的一个types参数。 而不是:实例化是你不能用T
做的less数事情之一。
除了上面链接的教程, Angelika Langers Generics FAQ是关于这个主题的一个很好的资源。
generics类是一种在创build数据types时将其作为参数的类。 此types参数使用尖括号指定,并且types可以在每次实例化类的新实例时更改。 例如,我们为Employee对象创build一个ArrayList,为Company对象创build另一个
ArrayList<Employee> employees = new ArrayList<Employee>(); ArrayList<Company> companies = new ArrayList<Company>();
您会注意到我们使用相同的ArrayList类来创build这两个列表,并且我们使用尖括号传入Employee或Companytypes。 让一个generics类能够处理多种types的数据,从而减less了执行类似任务的许多类。 generics也有助于减less错误,给所有的东西提供一个强大的types来帮助编译器指出错误。 通过为ArrayList指定types,如果您尝试将Employee添加到公司列表,则编译器将引发错误,反之亦然。