public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects = new ArrayList<T>(maxsize)
}
<T>
是什么意思?这是否意味着我可以创建T
类型的对象?#1 楼
<T>
是通用名称,通常可以读作“ T型”。它取决于<>左侧的类型,它的实际含义。我不知道
Pool
或PoolFactory
是什么,但您还提到ArrayList<T>
,它是标准Java类,因此,我将与之交谈。通常,您不会在其中看到“ T”,而会看到另一种类型。因此,例如,如果看到
ArrayList<Integer>
,则表示“ ArrayList
的Integer
”。例如,许多类都使用泛型来约束容器中元素的类型。另一个示例是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>
作为键您可以根据需要命名任何东西,这并不重要。
此外,
Integer
,String
,Boolean
等是Java的包装类,可在编译期间检查类型。例如,在上面的代码中,obj
的类型为String
,因此您无法向其添加任何其他类型(尝试obj.add(1)
会导致错误)。同样,obj1
是Integer
类型,您不能向其添加任何其他类型(尝试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列表中,反之亦然,编译器将抛出错误。
评论
我发现很难解析您的代码。一开始没有缩进,并且有两个开放的括号,只有一个封闭。 T createObject应该位于Pool或PoolFactory内部吗? this.freeObjects = ...应该在哪里?那是一个单独的例子吗?在那里存放是非法的。它必须在方法内部。如果有人正在寻找有关<>(钻石运算符)的信息,可以像List