参数化类型是什么意思?

41
这个链接 表示以下内容:

用实际类型参数实例化泛型类型称为参数化类型。 示例(参数化类型):

Collection<String> coll = new LinkedList<String>();

那么什么是参数化类型?
  • Collection<String> 或者
  • LinkedList<String>

15
你可以阅读一下你提供的链接中的下一句话:“声明 Collection<String> 表示参数化类型,它是泛型类型 Collection 的实例化,其中占位符 E 已被具体类型 String 替换”。 - JB Nizet
@JBNizet,是的,我的困惑源于实例化类型 LinkedList<String>。你下面的评论为我澄清了这一点。 - wulfgarpro
7个回答

46

它们都是带参数类型:即以其他类型作为参数的类型。

表达式两侧具有不同类型的事实是无关紧要的,并且与多态行为有关,即因为 LinkedListCollection 的子类型。


我认为该名称源于它们是已经具有具体参数的类型,即类型定义。这些参数是它们与通用类型不同之处。 - Kallaste

16

参数化类型通常是一个类,处理其他对象而不关注它们的类型。可以使用符号“名称”定义该类型,然后在创建类的实例时传递。

例如:

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> 表示 "字符串集合"。这意味着您不能向此集合添加其他类型的对象。

如果你有一个<T>,其中T是String,那么你可以传递所有的T子类,对吗? - Ungeheuer
1
几乎正确。除了String是final类,无法被扩展。 - AlexR
所以基本上任何通用类型都是参数化类型,对吗? - Harvey Lin
通用类型是一种将其他类型参数转换为类型参数的类型。通用类本身是一种通用类型,但通用类型不完整,因为我们无法声明变量通用类型。当我们给通用类型提供类型参数时,参数化类型是从通用类型构建而来的。因此它们是不同的。注意:原始类型也是参数化类型,它是使用Object类型参数实例化的。 - rosshjb

10

泛型类型和参数化类型似乎是同义词。但是,例如将Box<Integer>称为泛型类型似乎并不正确,因为在这个词的意义上它已经不再是泛型了。所以,可能应该这样说:

泛型类型是具有形式类型参数声明的类型。

class Box<T> { .. }

Box<T>是一个泛型类型

带参数的类型是具有实际类型参数的声明

Box<Integer> b;        

Box<Integer> 是一个参数化类型。

原始类型是没有实际类型参数的泛型类型声明。

class Box<T> { .. }
Box b;

Box 是一个原始类型


1
它们是不同的。泛型和参数化类型并不相同:参数化类型是形式为C<T1,...,Tn>的类或接口类型,其中C是泛型类型的名称,<T1,...,Tn>是表示泛型类型的特定参数化的类型参数列表。 - rosshjb
1
@rosshjb 是的,你说得对,它们是不同的。但术语定义是正确的。泛型类型是在其定义中声明类型参数的类或接口,而参数化类型是使用泛型类型(类型参数被实际类型参数替换,尽管实际类型参数类型可以是类型参数)。 - Roy Alilin
我写了一篇关于Java泛型规则的文章。它可能有助于加深对Java泛型的理解。这是链接:https://medium.com/@royalilin/java-generics-rules-1d05de86e9cb - Roy Alilin

4
这里是类型学名的简要解释...
- 类型参数:就是占位符,例如 "<T>"。 - 类型参数可以在声明时被传递给类型参数,例如 "<String>"。 - 带有形式类型参数的类型被称为泛型,例如 "List<T>"。 - 带有已声明类型参数的类型作为参数被称为具体化的泛型,例如 "List<String>"

1

集合的两种用法

Collection<String> 
LinkedList<String>

这里有参数化类型,其中使用了String类型。

1
即使这是一个相当老的问题,我仍然认为我可以添加一些东西 - 特别是澄清“通用类型”和“参数化类型”之间的区别,这在开始时有些困惑我。

根据Java Docs教程

我们将通用类型称为类型定义,例如:SomeType<T>,而我们将参数化类型称为类型调用,例如:SomeType<SpecificType>(当我们提供特定类作为类型参数的参数时)。

例如,List<T>是通用类型,List<String>是参数化类型。

-2

ParameterizedType表示参数化类型,例如Collection。

参数化类型是通过反射方法在第一次需要时创建的,如本包中所指定。创建参数化类型p时,将解析p实例化的通用类型声明,并递归地创建p的所有类型参数。有关类型变量创建过程的详细信息,请参见TypeVariable。重复创建参数化类型没有任何效果。

实现此接口的类的实例必须实现一个equals()方法,该方法将相等的任何两个共享相同通用类型声明并具有相等类型参数的实例相等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接