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

Lau*_*ghy 126 java generics

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

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

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

mgi*_*uca 141

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

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

通常,你不会看到"T",你会看到另一种类型.因此,如果您看到ArrayList<Integer>,例如,这意味着"An ArrayListof Integers." 例如,许多类使用泛型来约束容器中元素的类型.另一个例子是HashMap<String, Integer>"带有String键和Integer值的地图".

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

  • Pool<String>将有一个返回s PoolFactory<String>createObject方法的接口String.
  • 在内部,Pool<String>它将包含一个ArrayList字符串.

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

  • 到目前为止,我所看到的最好的解释之一:)非常感谢! (3认同)

小智 25

这很简单.这是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是<T>,你可以实际写任何东西,它将以相同的方式工作.尝试写<ABC>代替<T>.

这只是为了方便起见:

  • <T> 被称为任何类型
  • <E> 作为元素类型
  • <N> 作为数字类型
  • <V> 作为价值
  • <K> 作为关键

但你可以将它命名为任何你想要的东西,这并不重要.

此外,Integer,String,Boolean等是Java的包装类这在编译期间的类型检查帮助.例如,在上面的代码中,obj是类型String,所以你不能添加任何其他类型(尝试obj.add(1),它将转换错误).同样,obj1Integer类型,你不能添加任何其他类型(尝试obj1.add("hello"),错误将在那里).


小智 20

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

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

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


Raf*_*iek 9

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

PoolFactory<Integer> pool = new Pool<Integer>();
Run Code Online (Sandbox Code Playgroud)

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


Joa*_*uer 7

<>用于表示Java中的泛型.

T是此示例中的类型参数.不,实例化是你无法做的少数事情之一T.

除了上面链接的教程,Angelika Langers Generics FAQ是一个很好的资源.


Adi*_*iii 6

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

ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();
Run Code Online (Sandbox Code Playgroud)

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