gpt4 book ai didi

Java 泛型 - 类型不重要

转载 作者:行者123 更新时间:2023-11-29 08:43:46 25 4
gpt4 key购买 nike

(对不起标题,我想不出更好的)

我正在处理一个充满对原始类型的引用的大项目,我正试图摆脱它们。问题是在大多数情况下我们并不真正知道实际类型。一个例子可能是最好的解释方式。

考虑:

public interface Event<S, D> {
S getSource();
D getData();
}

public interface Listener<E extends Event<?, ?>> {
void onEvent(E event);
}

public interface Listenable<E extends Event<?, ?>> {
void addListener(Listener<E> listener);
void removeListener(Listener<E> listener);
}

public class DataAccess implements Listenable {

...

public void addListener(final Listener listener) {
eventHandler.addListener(listener);
}

public void removeListener(final Listener listener) {
eventHandler.removeListener(listener);
}
}

DataAccess 并不关心我们传入的监听器类型,因为它可以接收不同类型的事件。我怀疑泛型在这里以错误的方式使用,可能 Listener 和 Listenable 不需要是泛型?

我想过把Listener改成

public interface Listener {
void onEvent(Class<? extends Event<?, ?>> event);
}

但是 onEvent 将无法访问 Event 的方法。

我错过了什么吗?

最佳答案

如果我是你,我会在接口(interface)中尽可能保持最通用,我会让实现定义显式类型,否则,如果在你的接口(interface)中你只使用通配符,你将无法再受益于泛型的强大功能你的实现。

所以我会有这样的东西

public interface Event<S, D> {
S getSource();
D getData();
}

public interface Listener<E extends Event<S, D>, S, D> {
void onEvent(E event);
}

public interface Listenable<E extends Event<S, D>, S, D> {
void addListener(Listener<E, S, D> listener);
void removeListener(Listener<E, S, D> listener);
}

多亏了这种更加灵活的方法,如果您有接受特定事件的实现,您就可以缩小允许的事件类型,否则您仍然可以使用通配符来支持任何事件。

关于Java 泛型 - 类型不重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38014678/

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