我想爲泛型添加對語言的支持,但在此之前,我需要更清楚地瞭解泛型的內部。將通用類型實現爲一種語言
我現在的理解是,實例化類:
class ArrayList<T>
{
public int add(T object)
{
// ...
}
}
創建一個實例,其中的T
上add
參數的類型必須是一樣的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'只在類聲明中使用,如果這是你的意思。使用'ArrayList '作爲類型是沒有意義的(如果'T'未知)。 –
Hacketo
@Hacketo我知道,我的意思是抽象的。我試圖找出實例化對象是否仍然擁有它是一個泛型類型的實例的信息,或者是否使用展開的類型參數創建了一種新類型的虛擬類,這個對象現在是一個實例。這個問題對我來說非常重要,因爲它會決定整個語言中類型參數的傳播位置。如果它們從實例化中傳播出來,那麼只需要引用這些類型,如果從類名稱中,類需要從聲明中複製(比喻)。 – Flosculus
我的評論是關於'新的ArrayList()instanceof ArrayList ',當T不知道時不能成立,如果'T'是'Date',那麼你的結果與'new ArrayList ()instanceof ArrayList '。 'T''只用於泛型類的聲明,就像一個變量持有一個類型。 –
Hacketo