【发布时间】:2015-09-28 08:03:02
【问题描述】:
我想为一种语言添加对泛型的支持,但在此之前,我需要更清楚地了解泛型在其中的含义。
我目前的理解是实例化类:
class ArrayList<T>
{
public int add(T object)
{
// ...
}
}
创建一个实例,其中add 上的T 的参数类型必须与new ArrayList<T>() 上的类型参数相同,其中T 是一个真实类型。
实现这一点似乎很简单,但仅适用于这个用例。当它需要支持自省时,它就变成了一个更复杂的概念。例如,我不会这样说:
true === (new ArrayList<Date>() instanceof ArrayList)
但我想说:
true === (new ArrayList<Date>() instanceof ArrayList<Date>)
我的问题是,当使用ArrayList<Date> 作为类型引用时,它是从ArrayList<T> 派生的类型,还是本身就是一个类,例如:
$list = new ArrayList<Date>();
一个实例:
class ArrayList
{
public int add(Date $object)
{
// ...
}
}
或者它是ArrayList<T> 的一个实例,其中T 是Date?
【问题讨论】:
-
ArrayList<T>仅在类声明中使用,如果这是您的意思。使用ArrayList<T>作为类型没有意义(如果T未知)。 -
@Haketo 我知道,我说的是更抽象的意义。我试图弄清楚实例化的对象是否仍然包含它是泛型类型的实例的信息,或者是否使用扩展的类型参数创建了一种新的虚拟类,该对象现在是一个实例。这个问题对我来说非常重要,因为它将决定类型参数在整个语言中的传播位置。如果它们从实例化传播,则只需要引用类型,如果从类名中,则需要从声明中复制(形象地)类。
-
我的评论是关于
new ArrayList<Date>() instanceof ArrayList<T>的声明,当 T 未知时,如果T是Date,那么你的结果与new ArrayList<Date>() instanceof ArrayList<Date>相同。 `T` 仅用于泛型类声明,例如保存类型的变量。 -
@Haketo 哦,我明白了,我将删除
<T>然后,它在问题中的含义相同。本质上,这意味着ArrayList<Date>不应该等于ArrayList,因为ArrayList作为一个没有参数化类型的类是不存在的。 -
Java 使用type erasure,因此
$list是ArrayList的一个实例。
标签: oop generics types instantiation