JavaコードをC#に変換しようとしていますが、ジェネリックキャストに関して問題が発生しています。
私は次のメソッドを公開するCopyableと呼ばれるインターフェースタイプを持っています...
interface Copyable { void copyTo(Copyable target); }
そして、Copyableインターフェースを実装するために制限されているジェネリック型をパラメーターとして受け取るAtomicObject型...
class AtomicObject<T> where T : class, Copyable {
public T openRead();
AtomicObjectsをオブジェクトタイプのディクショナリに格納しますが、AtomicObjectクラスに固有の「openRead」メソッドを呼び出すためにオブジェクトをAtomicObjectsにキャストバックする必要があります...
foreach (KeyValuePair<object, object> entry in dict)
{
AtomicObject<Copyable> obj = (AtomicObject<Copyable>)entry.Key;
Copyable dest = (Copyable)obj.openRead();//get the destination
}
AtomicObjectのパラメーターの役割を果たすListNodeタイプを実装しました...
class ListNode<T> : Copyable
AtomicObject<ListNode<string>> atomic = new AtomicObject<ListNode<string>>();
このコードをコンパイルすることはできますが、このプログラムを実行すると、ランタイムシステムがタイプのオブジェクトを変換できないため、「InvalidCastException」が生成されます。
AtomicObject<ListNode<string>>
に...
AtomicObject<Copyable>.
ただし、ListNodeのタイプはCopyableです。これが正しくキャストできない理由を誰かが説明できますか?最も重要なことは、ListNodeに含まれるパラメーターのタイプを知る必要があるDictionaryまたはforeachループに依存しない修正を誰かが提案できるかどうかです。たとえば、Javaでは...
AtomicObject<?> obj = (AtomicObject<?>)entry.Key;
ただし、これはC-Sharpでは不可能です。