次のような単純なクラス階層を作成する場合:
type
fooObj = ref object {.inheritable.}
barObj = ref object of fooObj
bazObj = ref object of fooObj
x: string
var troz: fooObj
let bar = barObj()
let baz = bazObj(x: "yes")
echo bar[]
# ()
echo baz[]
# (x: yes)
troz = bar
echo troz[]
# ()
troz = baz
echo troz[]
# ()
echo bazObj(troz).x
#yes
x
型のメンバー変数にアクセスすると、期待される出力 (行に表示) が得られますbazObj
。
ジェネリックを使用して同様の階層を作成すると、コードは正常にコンパイルされますが、ObjectConversionError
例外がスローされます。私の構文は間違っていますか?それとも、Nim ではサポートされていないジェネリックを使用したこのタイプのオブジェクト変換ですか?
type
fooObj[T] = ref object {.inheritable.}
barObj[T] = ref object of fooObj[T]
bazObj[T] = ref object of fooObj[T]
x: T
var troz: fooObj[system.string]
let bar = barObj[system.string]()
let baz = bazObj[system.string](x: "yes")
echo bar[]
# ()
echo baz[]
# (x: yes)
troz = bar
echo troz[]
#()
troz = baz
echo troz[]
#()
echo bazObj[system.string](troz).x
#Traceback (most recent call last)
#foo.nim(22) foo
#Error: unhandled exception: invalid object conversion [ObjectConversionError]
22 行目を に置き換えるとecho bazObj(troz).x
、コンパイル時に次のようになります。
foo.nim(22, 13) Error: type mismatch: got (fooObj[system.string]) but expected 'bazObj'