【发布时间】:2021-04-17 16:53:03
【问题描述】:
当我在 C# 中尝试以下操作时,我得到一个 NPE。这可能不是这样工作的:
private readonly Dictionary<Type, List<Subscription<Event>>> subscriptionMap = new Dictionary<Type, List<Subscription<Event>>>();;
public void Subscribe<T>(Action<T> action) where T : Event {
...
subscriptionMap[type].Add(new DefaultSubscription<T>(action) as Subscription<Event>);
...
}
如果没有as,我会收到编译器错误,并且它只会在列表中添加一个空值。我应该注意到Subscription 和Event 都是接口。在 Java 中,我会简单地说 <? extends Event> 或 <? extends Subscription<?>>,这不会有任何问题。
非常感谢您对此事的任何帮助!
【问题讨论】:
-
什么是
DefaultSubscription<T>,它与Subscription有什么关系? -
它正在执行
Subscription<T : Event> -
请注意,仅仅因为两种类型表现出特定的继承/实现关系,并不意味着由这些类型参数化的泛型表现出 same 关系。您看到 null 正是因为实例无法转换为“基本”类型。
-
在这种情况下,我应该如何基于基本接口创建一个通用列表来存储订阅组合?
-
即使我在没有模板的情况下制作
Subscription混凝土,我也有与Action<T>相同的问题,我无法将其传递给Subscription,因为我无法将其转换为Action<Event>出于什么原因。