T>の要素のみを含む汎用TObjectList < T>を含む汎用クラスを作成しようとしています。TGenericClass <T> TObjectListを含む<T>はコンパイルされません
uses
Generics.Collections;
type
TItem = class
end;
TGenericClass<T: TItem> = class
public
SimpleList: TList<T>; // This compiles
ObjectList: TObjectList<T>; // This doesn't compile: Compiler complaints that "T is not a class type"
end;
これは間違った構文ですか? BTW:TGenericClass < T:class>がコンパイルされますが、リスト内の項目はTitemではなくなりました。これは私が望ましくないものです。
ええ、これはうまくいくでしょうが、まさに、ジェネリックリストが私たちを解放するために導入された醜いコードのようなものです。これは純粋でシンプルなコンパイラのバグです。それはチームによって認められており、間もなく修正される予定です。このような回避策は現時点では機能しますが、あまりにもそれに慣れないでください。 –
はい、同意します。コンパイラのバグはStebiが自分のコードを修正した後でしか修正されない可能性があります:-)また、ObjectList宣言の型としてTItemを渡すことをお勧めします。私が考えることができる欠点。 –
あなたが正しいのですが、私がオブジェクトリストを一般に公開することを避ければ、すべてが解決可能です。しかし、私は通常のオブジェクトリストを使用してアイテムを希望のタイプTにキャストするだけで十分でしょう。キャストは簡単ではありませんが(コンパイラビッグもそうですが)、ここのように解決できます:http://stackoverflow.com/questions/ 580108/delphi-generic-constraints-problem –