此链接说明以下内容:
具有实际类型参数的泛型类型的实例化称为参数化类型。 示例(参数化类型):
Collection<String> coll = new LinkedList<String>();
那么什么是参数化类型呢?
Collection<String>
或LinkedList<String>
它们都是参数化类型:将其他类型作为参数的类型。
表达式两侧具有不同类型的事实是无关紧要的,并且与多态行为有关,即因为
LinkedList
是 Collection
的子类型。
参数化类型通常是一个处理其他对象的类,而不关心它是什么类型。类型可以使用符号“名称”来定义,然后在创建类的实例时传递。
例如:
class MyClass<T> {
private T obj;
public MyClass<T>(T obj) {
this.obj = obj;
}
public int getId() {
return obj.hashCode();
}
}
在上面的示例中,
MyClass
包装任何类型的对象并使用该方法始终存在的事实来执行其方法hashCode()
。
这个类的使用方法如下:
int sid = new MyClass<String>("aaaa").hashCode();
请注意,你不能说
new MyClass<String>(123)
:对象是使用参数String
创建的,这一事实决定了构造函数参数的类型。
回到你的例子
Collection<String>
意思是“字符串的集合”。这意味着您不能将其他类型的对象添加到此集合中。
看来泛型类型和参数化类型是同义词。 但将
Box<Integer>
称为泛型类型似乎是不正确的,因为从这个词的意义上来说不再是泛型了。所以可能是:
泛型类型是带有形式类型参数的声明
class Box<T> { .. }
Box<T>
是通用类型
参数化类型是带有实际类型参数的声明
Box<Integer> b;
Box<Integer>
是参数化类型
原始类型是没有实际类型参数的泛型类型的声明。
class Box<T> { .. }
Box b;
Box
是原始类型
这是术语的快速细分...
"<T>"
"<String>"
"List<T>"
"List<String>"
即使这是一个相当老的问题,我仍然认为我可以添加一些东西 - 特别是澄清术语“通用类型”和“参数化类型”之间的区别,这在一开始在某种程度上让我感到困惑。
来自 Java 文档教程:
我们将 generic type 称为类型定义,例如:
SomeType<T>
,并将参数化类型称为类型调用,例如:SomeType<SpecificType>
(当我们提供特定类作为类型参数的实参时)。
例如
List<T>
是泛型类型,List<String>
是参数化类型。
集合的两种用途
Collection<String>
LinkedList<String>
这里是参数化类型,
String
是使用的类型。
“参数”一词指的是函数声明中用于表示传入值的标记变量。例如,在称为 void print(String arg)
的
print("text")
中,arg
将是参数。使用的另一个词是论证。但有时它指的是实际值,这里是
"text"
。这些词可以互换使用。因此,参数化类型将是一种接受参数并编写为使用该参数的类型(类或接口)。在这种情况下,参数是类型,因此是类型参数。
参数化类型是在反射方法第一次需要时创建的,如本包中所指定的。创建参数化类型 p 时,将解析 p 实例化的泛型类型声明,并递归创建 p 的所有类型参数。有关类型变量创建过程的详细信息,请参阅 TypeVariable。重复创建参数化类型没有任何效果。
实现此接口的类的实例必须实现 equals() 方法,该方法使共享相同泛型类型声明并具有相同类型参数的任何两个实例相等。