我目前正在学习 Java,最近被尖括号(< >)难住了。它们到底是什么意思?
public class Pool<T>{ public interface PoolFactory<T>{ public T createObject(); } this.freeObjects = new ArrayList<T>(maxsize) }
<T>是什么意思? 它是否意味着我可以创建一个类型为 T的对象?
<T>
T
在 Java 中,<>用于指示 非专利药。
<>
T是此示例中的类型参数。实例化是 不行用 T做的少数几件事情之一。
除了上面链接的教程之外,Angelika Langers 常见问题解答是关于这个主题的一个很好的资源。
可以像下面这样实例化一个对象 Pool:
PoolFactory<Integer> pool = new Pool<Integer>();
泛型参数只能是引用类型。所以不能使用像 int、 double、 char 或其他基元类型这样的基元类型。
<T>是 一般,通常可以读作“类型 T”。它取决于 < > 左边的类型它实际上是什么意思。
我不知道什么是 Pool或者 PoolFactory,但是你们也提到了 ArrayList<T>,它是一个标准的 Java 类,所以我会谈到它。
Pool
PoolFactory
ArrayList<T>
通常,你不会看到“ T”在那里,你会看到另一种类型。所以如果你看到例如 ArrayList<Integer>,这意味着“ ArrayList的 Integer。”许多类使用泛型来约束容器中元素的类型,例如。另一个例子是 HashMap<String, Integer>,意思是“具有 String键和 Integer值的映射”
ArrayList<Integer>
ArrayList
Integer
HashMap<String, Integer>
String
您的 Pool 示例有点不同,因为这里是 定义类。因此,在这种情况下,您正在创建一个类,其他人可以用一个特定的类型代替 T 来实例化它。例如,我可以使用您的类定义创建一个类型为 Pool<String>的对象。这意味着两件事:
Pool<String>
createObject
PoolFactory<String>
这是一个好消息,因为在另一个时间,我可以来创建一个 Pool<Integer>,它将使用相同的代码,但有 Integer无论你在源代码中看到 T。
Pool<Integer>
这和 Java的类型擦除有关。如果我提到了 ArrayList<String>,那就意味着我只能将 String 类型的对象添加到数组列表中。
ArrayList<String>
Java的类型擦除的两大好处是:
泛型类是在创建数据类型时将其作为参数接受的类型。使用尖括号指定此类型参数,并且每次实例化类的新实例时,该类型都可以更改。例如,让我们为 Employee 对象创建一个 ArrayList,为 Company 对象创建另一个 ArrayList
ArrayList<Employee> employees = new ArrayList<Employee>(); ArrayList<Company> companies = new ArrayList<Company>();
您会注意到,我们使用相同的 ArrayList 类来创建这两个列表,并使用尖括号传入 Employee 或 Company 类型。使用一个泛型类能够处理多种类型的数据,可以减少执行类似任务的类的数量。 泛型还有助于减少 bug,因为它为所有内容提供强类型,从而帮助编译器指出错误。通过为 ArrayList 指定类型,如果您试图将 Employee 添加到 Company 列表中,编译器将抛出错误,反之亦然。
很简单。这是 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>。
<ABC>
这只是为了方便:
<E>
<N>
<V>
<K>
但你可以给它起任何名字,无所谓。
此外,Integer、 String、 Boolean等都是 Java 的包装类,有助于在编译过程中检查类型。例如,在上面的代码中,obj的类型为 String,因此不能向其添加任何其他类型(请尝试 obj.add(1),它将强制转换错误)。类似地,obj1是 Integer类型,您不能向它添加任何其他类型(请尝试 obj1.add("hello"),错误将出现)。
Boolean
obj
obj.add(1)
obj1
obj1.add("hello")