当前位置: 首页 > 知识库问答 >
问题:

列表中的Java泛型实例-泛型可观察和所有

桑睿识
2023-03-14

如何在Java中正确建模包含泛型类型的多个实例的列表,每个实例不一定具有完全相同的具体类型参数(而是共享的公共根类型)。

java prettyprint-override">
public interface Event {
}

public interface Listener<T extends Event> {
    void handle(T event);
}

public class Publisher {
    private List<Listener<? extends Event>> listeners = new ArrayList<>();

    public <T extends Event> void addListener(final Listener<T> listener) {
        listeners.add(listener);
    }

    public <T extends Event> void publish(final T event) {
        for (final Listener<? extends Event> listener : listeners) {
            try {
                listener.handle(event); // *** this is not working: incompatible types
            } catch (final Exception ex) {
                // ...
            }
        }
    }
}

共有1个答案

赏阳嘉
2023-03-14

参数化publisher类。如果希望它是类型安全的,Listeners列表需要了解T

public class Publisher<T extends Event> {
    private List<Listener<T>> listeners = new ArrayList<>();

    public void addListener(final Listener<T> listener) {
        listeners.add(listener);
    }

    public void publish(final T event) {
        for (final Listener<T> listener : listeners) {
            try {
                listener.handle(event);
            } catch (final Exception ex) {
                // ...
            }
        }
    }
}

如果希望更加灵活,可以放松侦听器的限制,以接受任何TT的超类。

public class Publisher<T extends Event> {
    private List<Listener<? super T>> listeners = new ArrayList<>();

    public void addListener(final Listener<? super T> listener) {
        listeners.add(listener);
    }

    public void publish(final T event) {
        for (final Listener<? super T> listener : listeners) {
            try {
                listener.handle(event);
            } catch (final Exception ex) {
                // ...
            }
        }
    }
}
 类似资料:
  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据

  • 理论之后,我们转移到一些实际功能上面,这会让我们更加简单地掌握它。为了不重复发明轮子,我使用三个Kotlin标准库中的三个函数。这些函数让我们仅使用泛型的实现就可以做一些很棒的事情。它可以鼓舞你创建自己的函数。 let let实在是一个简单的函数,它可以被任何对象调用。它接收一个函数(接收一个对象,返回函数结果)作为参数,作为参数的函数返回的结果作为整个函数的返回值。它在处理可null对象的时候是

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 问题内容: 我为缓存编写了一个函数来检索特定对象。这样我就不需要投了。 我正在这样使用 但是现在我的缓存中有一个字符串列表,我不能这样使用 问题是。我对Java非常陌生,我该怎么写? 问题答案: 您无法获得的类,在您的情况下,唯一的方法是:

  • 问题内容: 我的问题是这样的: 为什么不能使用类Class的new T()和newInstance()实例化泛型? 问题答案: 您需要使用反射(),因为在编译时需要链接其构造函数的类是未知的。因此,编译器无法生成链接。

  • 问题内容: 我想在Java中创建泛型类型的对象。请提出如何实现相同的建议。 注意:这似乎是一个简单的泛型问题。但是我打赌..不是。:) 假设我的类声明为: 问题答案: 你必须添加异常处理。 你必须在运行时传递实际类型,因为它不是编译后字节码的一部分,因此,没有显式提供它就无法知道它。