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

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


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

评论

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

如果有人正在寻找有关<>(钻石运算符)的信息,可以像List list = new ArrayList <>();这样使用该信息;请访问docs.oracle.com/javase/7/docs/technotes/guides/language/…。

#1 楼

<T>是通用名称,通常可以读作“ T型”。它取决于<>左侧的类型,它的实际含义。

我不知道PoolPoolFactory是什么,但您还提到ArrayList<T>,它是标准Java类,因此,我将与之交谈。

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

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


我的Pool<String>将具有一个PoolFactory<String>接口,该接口带有一个createObject方法,该方法返回String s。
内部,Pool<String>将包含一个ArrayList字符串。 br />
这是个好消息,因为在另一个时间,我可以一起创建一个使用相同代码的Pool<Integer>,但是无论在哪里看到Integer,都可以使用T

评论


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

– Suhas Chikkanna
18/12/18在16:29

#2 楼

真的很简单。这是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,因此您无法向其添加任何其他类型(尝试obj.add(1)会导致错误)。同样,obj1Integer类型,您不能向其添加任何其他类型(尝试obj1.add("hello"),错误在那里)。

#3 楼

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

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


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


#4 楼

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

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


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

#5 楼

<>用于指示Java中的泛型。

T是此示例中的类型参数。而且不行:实例化是T不能做的少数事情之一。

除了上面链接的教程之外,Angelika Langers Generics FAQ是有关该主题的重要资源。

#6 楼

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

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


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