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

什么是<;T>;(尖括号)在Java中是什么意思?,java,generics,Java,Generics,我目前正在学习Java,最近被尖括号()难住了。它们到底是什么意思 public class Pool<T>{ public interface PoolFactory<T>{ public T createObject(); } this.freeObjects = new ArrayList<T>(maxsize) } 公共类池{ 公共接口池工厂{ 公共T createObject(); } this.freeOb

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

public class Pool<T>{
    public interface PoolFactory<T>{
        public T createObject();
    }
    this.freeObjects = new ArrayList<T>(maxsize)
}
公共类池{
公共接口池工厂{
公共T createObject();
}
this.freeObjects=新的ArrayList(maxsize)
}
是什么意思?这是否意味着我可以创建类型为
T
的对象?

用于在Java中表示

T
是本例中的类型参数。否:实例化是不能用
t
做的少数事情之一


除了上面链接的教程之外,还有一个关于这个主题的很好的资源。

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

PoolFactory<Integer> pool = new Pool<Integer>();
PoolFactory pool=new pool();
泛型参数只能是引用类型。因此,不能使用诸如int、double、char或其他基本类型的基本类型。

是一种泛型,通常可以理解为“类型t”。这取决于它实际含义左边的类型

我不知道什么是
Pool
PoolFactory
,但您也提到了
ArrayList
,它是一个标准的Java类,所以我将讨论它

通常,你不会在那里看到“t”,你会看到另一种类型。例如,如果您看到
ArrayList
,这意味着
Integer
s的
ArrayList
。例如,许多类使用泛型来约束容器中元素的类型。另一个例子是
HashMap
,意思是“具有
String
键和
Integer
值的映射。”

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

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

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

它与java中的泛型相关。如果我提到了
ArrayList
,这意味着我只能向该ArrayList添加字符串类型的对象

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

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

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

    ArrayList<Employee> employees = new ArrayList<Employee>();
    ArrayList<Company> companies = new ArrayList<Company>();
    
    ArrayList employees=new ArrayList();
    ArrayList公司=新的ArrayList();
    
    您会注意到,我们使用相同的ArrayList类来创建这两个列表,并使用尖括号传入Employee或Company类型。让一个泛型类能够处理多种类型的数据可以减少让许多类执行类似任务的工作量。
    泛型还有助于减少bug,因为它为所有东西提供了一个强类型,帮助编译器指出错误。通过为ArrayList指定类型,如果您试图将员工添加到公司列表中,编译器将抛出一个错误,反之亦然。

    这非常简单。这是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);
        }
    }
    
    A类{
    T-obj;
    无效添加(T obj){
    obj=obj;
    }
    不明白{
    返回obj;
    }
    }
    公共类泛型{
    静态无效打印(E[]元素){
    对于(E元素:元素){
    系统输出打印项次(元素);
    }
    }
    公共静态void main(字符串[]args){
    A obj=新的A();
    A obj1=新A();
    对象添加(“你好”);
    增加(6);
    System.out.println(obj.get());
    System.out.println(obj1.get());
    整数[]arr={1,3,5,7};
    打印(arr);
    }
    }
    
    实际上,您可以编写任何东西,而不是
    ,并且它将以相同的方式工作。试着写
    来代替

    这只是为了方便起见:

    • 被称为任何类型
    • 作为元素类型
    • 作为数字类型
    • 作为值
    • 作为键
    但是你可以给它取任何你想要的名字,这并不重要


    此外,
    Integer
    String
    Boolean
    等都是Java的包装类,它们有助于在编译过程中检查类型。例如,在上述代码中,
    obj
    的类型为
    String
    ,因此您不能向其添加任何其他类型(请尝试
    obj.add(1)
    ,它将抛出错误)。类似地,
    obj1
    属于
    Integer
    类型,您无法向其添加任何其他类型(请尝试
    obj1.add(“hello”)
    ,将出现错误)。

    我发现很难解析您的代码。开始时没有缩进,有两个大括号打开,只有一个大括号关闭。
    T createObject
    应该在池或池工厂内吗?
    this.freeObjects=…
    应该在哪里?这是一个单独的例子吗?把它放在那里是违法的;它必须在一个方法中。如果有人正在查找有关
    (菱形运算符)的信息,这些信息可以像