繁体   English   中英

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

[英]What does <T> (angle brackets) mean in Java?

我目前正在研究 Java,最近被尖括号(<>)难住了。 它们到底是什么意思?

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

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

<T>是一个泛型,通常可以理解为“T 型”。 这取决于 <> 左侧的类型,它的实际含义是什么。

我不知道PoolPoolFactory是什么,但您也提到了ArrayList<T> ,它是标准的 Java class,所以我会谈谈。

通常,你不会在那里看到“T”,你会看到另一种类型。 因此,例如,如果您看到ArrayList<Integer> ,则表示“ ArrayList s 的Integer ”。 例如,许多类使用 generics 来约束容器中元素的类型。 另一个例子是HashMap<String, Integer> ,意思是“带有String键和Integer值的 map”。

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

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

这是个好消息,因为在另一个时候,我可以来创建一个Pool<Integer> ,它将使用相同的代码,但在源代码中看到T的任何地方都有Integer

这真的很简单。 这是J2SE 5中引入的一个新特性。 在 class 名称之后指定 angular 括号意味着您正在创建一个可以保存任何类型数据的临时数据类型。

例子:

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 的包装类,它们有助于在编译期间检查类型。 例如,在上面的代码中, objString类型,所以你不能向它添加任何其他类型(尝试obj.add(1) ,它会抛出错误)。 同样, obj1属于Integer类型,您不能向其添加任何其他类型(尝试obj1.add("hello") ,会出现错误)。

与java中的generics相关。 如果我提到ArrayList<String>这意味着我只能将字符串类型 object 添加到 ArrayList。

Java中的generics的两大好处是:

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

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

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

泛型参数只能是引用类型。 所以你不能使用原始类型,如 int 或 double 或 char 或其他原始类型。

<>用于表示Java中的generics。

T在本例中是一个类型参数。 不:实例化是你不能T做的少数事情之一。

除了上面链接的教程之外, Angelika Langers Generics FAQ是关于该主题的一个很好的资源。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM