是什么 (尖括号)是指Java?

问题描述 投票:111回答:6

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

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

<T>是什么意思?这是否意味着我可以创建T类型的对象?

java generics
6个回答
128
投票

<T>是通用的,通常可以读作“T型”。它取决于<>左边的类型实际意味着什么。

我不知道PoolPoolFactory是什么,但你也提到ArrayList<T>,这是一个标准的Java类,所以我会谈到它。

通常,你不会看到“T”,你会看到另一种类型。所以,如果你看到ArrayList<Integer>,那就意味着“Qazxswpoi的ArrayList”。例如,许多类使用泛型来约束容器中元素的类型。另一个例子是Integer,意思是“带有HashMap<String, Integer>键和String值的地图”。

您的Pool示例有点不同,因为您正在定义一个类。因此,在这种情况下,您正在创建一个其他人可以使用特定类型代替T进行实例化的类。例如,我可以使用您的类定义创建Integer类型的对象。这意味着两件事:

  • 我的Pool<String>将有一个接口Pool<String>PoolFactory<String>方法返回createObjects。
  • 在内部,String将包含一个Pool<String>字符串。

这是个好消息,因为在另一个时间,我可以来创建一个使用相同代码的ArrayList,但无论你在源头看到Pool<Integer>,都有Integer


20
投票

它与java中的泛型有关。如果我提到T这意味着我只能将String类型对象添加到该ArrayList。

Java中泛型的两个主要好处是:

  1. 减少程序中的强制转换数量,从而减少程序中潜在错误的数量。
  2. 提高代码清晰度

18
投票

这很简单。这是J2SE 5中引入的新功能。在类名后面指定角括号意味着您正在创建一个可以保存任何类型数据的临时数据类型。

例:

ArrayList<String>

而不是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>IntegerString等是Java的包装类,它有助于在编译期间检查类型。例如,在上面的代码中,Boolean的类型为obj,所以你不能添加任何其他类型(尝试String,它会抛出错误)。同样,obj.add(1)obj1类型,你不能添加任何其他类型(尝试Integer,错误将在那里)。


9
投票

被称为泛型类型。您可以像这样实例化对象池:

obj1.add("hello")

泛型参数只能是引用类型。因此,您不能使用原始类型,如int或double或char或其他基本类型。


6
投票

PoolFactory<Integer> pool = new Pool<Integer>(); 用于表示Java中的<>

generics是此示例中的类型参数。不,实例化是你用T做的少数事情之一。

除了上面链接的教程,T是关于这个主题的一个很好的资源。


5
投票

泛型类是一种类,它在创建时将数据类型作为参数接收。此类型参数使用尖括号指定,并且每次实例化类的新实例时类型都可以更改。例如,让我们为Employee对象创建一个ArrayList,为Company对象创建另一个ArrayList

Angelika Langers Generics FAQ

您会注意到我们使用相同的ArrayList类来创建两个列表,并使用尖括号传递Employee或Company类型。让一个通用类能够处理多种类型的数据减少了许多执行类似任务的类。泛型还通过提供一个强大的类型来帮助编译器指出错误,从而帮助减少错误。通过为ArrayList指定类型,如果您尝试将Employee添加到Company列表中,编译器将抛出错误,反之亦然。

© www.soinside.com 2019 - 2024. All rights reserved.