インターフェイスとジェネリック、どう使う?

R.Tanaka.Ichiro's Blog:インターフェイスでジェネリック
このエントリの流れからきている話です。→R.Tanaka.Ichiro's Blog:インターフェイス(その2)
C#は不得手なのでリンク先のコードをVisual Basicで書いてみた。


[Visual Basic]


Public Interface IGen(Of T)

ReadOnly Property Value() As T

End Interface



Public Class Gen
Implements IGen(Of Integer)


Public ReadOnly Property Value() As Integer Implements IGen(Of Integer).Value
Get
Return 5
End Get
End Property


End Class



Public Class Sample(Of T)


Public Sub New(ByVal g As Gen)

Dim i As IGen(Of T) = DirectCast(g, IGen(Of T))

End Sub


End Class

んで、このクラスを使ってみたりしたわけです。

[Visual Basic]


Public Class Program


Public Shared Sub Main()

Dim g As New Gen

Dim s As New Sample(Of Date)(g)

End Sub


End Class

おもいっきり怒られたー!orz*1
そりゃそーだよね。ってわけでコメント欄にその旨だけ残してみたわけですが。個人的には、Nullさんのコメントにあるようにタイプセーフでないことが気になりますね。
「(Of T)」なだけのジェネリックでは'T'に何が指定されるかわかりません。なので、今回のような実行時エラーを引き起こす可能性が出ちゃうんですね。このあたり、ある程度は(Of T As {Class, New})なんかで何とかなるでしょうけれど、限界はありそうです。今回のようなキャストできることを保証する'T'の制約ってあるのでしょうか?

# コメント欄にC#でコード残してきたことが何よりドキドキした・・・。

*1:キャストデキネーズラーってさ。