我正在尝试将 Java 代码转换为 C#,但在泛型转换时遇到了问题。
我有一个名为 Copyable 的接口类型,它公开了以下方法......
interface Copyable { void copyTo(Copyable target); }
还有一个 AtomicObject 类型,它以一个泛型类型作为参数,该泛型类型被限制为实现 Copyable 接口......
class AtomicObject<T> where T : class, Copyable {
public T openRead();
我将 AtomicObjects 存储在对象类型的字典中,但我需要将对象转换回 AtomicObjects 以调用特定于 AtomicObject 类的“openRead”方法......
foreach (KeyValuePair<object, object> entry in dict)
{
AtomicObject<Copyable> obj = (AtomicObject<Copyable>)entry.Key;
Copyable dest = (Copyable)obj.openRead();//get the destination
}
我已经实现了一个 ListNode 类型,它扮演 AtomicObject 参数的角色......
class ListNode<T> : Copyable
AtomicObject<ListNode<string>> atomic = new AtomicObject<ListNode<string>>();
我可以编译这段代码,但是当我运行这个程序时,它会产生一个“InvalidCastException”,因为运行时系统无法转换类型的对象......
AtomicObject<ListNode<string>>
到...
AtomicObject<Copyable>.
然而 ListNode 是 Copyable 类型的。谁能解释为什么不能正确转换?最重要的是,任何人都可以建议一个不依赖于字典或 foreach 循环的修复,而必须知道 ListNode 包含什么类型的参数?例如,在 Java 中,我可以做到...
AtomicObject<?> obj = (AtomicObject<?>)entry.Key;
但这在 C-Sharp 中是不可能的。