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

我目前正在学习Java,最近被尖括号(<>)难倒了。 他们究竟是什么意思?

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

<T>是什么意思? 这是否意味着我可以创build一个Ttypes的对象?

<T>是一个通用的 ,通常可以理解为“T型”。 它取决于<>的实际意义左边的types。

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

通常情况下,你不会看到“T”,你会看到另一种types。 所以如果你看到ArrayList<Integer> ,那就意味着“ IntegerArrayList ”。 例如,许多类使用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的两个主要优点是:

  1. 减less程序中的强制转换次数,从而减less程序中潜在的错误数量。
  2. 改善代码清晰度

这很简单。 这是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>作为关键

但是,你可以任何你想要的名字,这并不重要。

此外, IntegerStringBoolean等是Java的包装类,这有助于在编译期间检查types。 例如,在上面的代码中, objStringtypes的,所以你不能添加任何其他的types(尝试obj.add(1) ,它会投出错误)。 类似的, obj1Integertypes,你不能添加任何其他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添加到公司列表,则编译器将引发错误,反之亦然。