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


139

我目前正在学习Java,最近被尖括号(<>)所困扰。它们到底是什么意思?

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

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


4
我发现很难解析您的代码。一开始没有缩进,并且有两个开放的括号,只有一个封闭。被T createObject认为是内部池或PoolFactory?this.freeObjects = ...应该在哪里?那是一个单独的例子吗?在那里存放是非法的。它必须在方法内部。
mgiuca'7

如果有人是在寻找有关信息<>(钻石运营商)可能喜欢使用List<Integer> list = new ArrayList<>();访问docs.oracle.com/javase/7/docs/technotes/guides/language/...
Pshemo '18

Answers:


161

<T>通用的,通常可以理解为“ T型”。它取决于<>左侧的类型的实际含义。

我不知道什么是Pool或者PoolFactory是,不过你还别说ArrayList<T>,这是一个标准的Java类,所以我会跟那个。

通常,您不会在其中看到“ T”,而是会看到另一种类型。因此ArrayList<Integer>,例如,如果看到,则表示“ An ArrayListof Integers”。例如,许多类使用泛型来约束容器中元素的类型。另一个示例是HashMap<String, Integer>,表示“具有String键和Integer值的映射”。

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

  • Pool<String>的接口将PoolFactory<String>带有createObject返回Strings 的方法。
  • 在内部,Pool<String>包含ArrayList字符串。

这是个好消息,因为在另一个时间,我可以创建一个Pool<Integer>将使用相同代码的代码,但是Integer无论您T在源代码中看到的是什么。


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

34

真的很简单。这是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>

这只是为了方便:

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

但是您可以随便命名,这并不重要。

此外,IntegerStringBoolean等都是包装类的Java,帮助在编译过程中的类型检查。例如,在上面的代码中,obj类型是String,因此您不能向其添加任何其他类型(try obj.add(1),它将引发错误)。同样,obj1是的Integer类型,您不能向其添加任何其他类型(try obj1.add("hello"),错误在那里)。


23

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

Java中泛型的两个主要优点是:

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

11

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

PoolFactory<Integer> pool = new Pool<Integer>();

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



8

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

ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.