gpt4 book ai didi

java - 使用不同的通用类型实现同一通用 Java 接口(interface)的多个实例?

转载 作者:行者123 更新时间:2023-11-30 06:57:20 26 4
gpt4 key购买 nike

我正在设计一个事件驱动系统,遇到了一些关于泛型的基本 API 问题。

我希望所有事件都扩展BaseEvent:

// Groovy pseudo-code
abstract BaseEvent {
Date occurredOn

BaseEvent() {
super()

this.occurredOn = new Date() // Now
}
}

我希望所有事件监听器都实现一些基本接口(interface):

interface EventListener<EVENT extends BaseEvent> {
void onEvent(EVENT event)
}

所以这对于只处理单一类型事件的简单监听器非常有用:

class FizzEvent extends BaseEvent { ... }

class FizzEventListener implements EventListener<FizzEvent> {
@Override
void onEvent(FizzEvent fizzEvent) {
...
}
}

但是我会有一些监听器需要处理多种类型的事件:

class BuzzEvent extends BaseEvent { ... }

// So then, ideally:
class ComplexListener implements EventListener<FizzEvent>,
EventListener<BuzzEvent> {
@Override
void onEvent(FizzEvent fizzEvent) {
...
}

@Override
void onEvent(BuzzEvent buzzEvent) {
...
}
}

但这会产生编译器错误:

Name clash: The method onEvent(EVENT) of type EventListener has the same erasure as onEvent(EVENT) of type EventListener but does not override it

知道处理多个事件的解决方案是什么吗?

最佳答案

您遇到的问题称为类型删除,这是 Java 实现泛型的方式。这意味着,对于 Java,以下代码行:

@Override
void onEvent(FizzEvent fizzEvent) {
...
}

@Override
void onEvent(BuzzEvent buzzEvent) {
...
}

真的看起来像这样:

@Override
void onEvent(BaseEvent fizzEvent) {
...
}

@Override
void onEvent(BaseEvent buzzEvent) {
...
}

请注意,类型信息已被“删除”,只有父类(super class)型 BaseEvent 保留为两种方法的类型参数,这会导致歧义并且无法正常工作。

如果没有使用 extends 关键字,它只会看到 Object,但仍然会遇到同样的问题。

这与 C# 形成对比,C# 使用类型具体化 来实现泛型,并且可以在运行时知道类型的差异。

换句话说,如果您询问 Java List<Dog> 是否与 List<Car> 是同一类型的列表,Java 会说"is",因为它在运行时不知道更好,而 C# 会说“否”,因为它保留类型信息。

Any ideas what the solution is for handling multiple events?

如果您想使用相同的监听器接口(interface)(例如 onDogBarkEvent(Dog d)onCatMeowEvent(Cat c) 或可能为不同类型的事件创建单独的监听器接口(interface)(例如 DogBarkListenerCatMeowListener )),您将需要使用不同的方法名称或签名。

这应该通过一些 Java 选项为您指明正确的方向。

除此之外,如果您真的对自己的选择有强烈的感觉并且也可以自由选择编程语言,那么您可以考虑尝试一下 C#,看看它是否更适合您。

关于java - 使用不同的通用类型实现同一通用 Java 接口(interface)的多个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33535468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com