用于处理泛型参数的JDK接口

时间:2011-12-13 01:39:52

标签: generics interface java java-7

JDK的界面是否如下所示:

public interface Callback<T> {
    public void process(T t);
}

要求是实现运行代码的回调,但不返回任何内容。

我可以编写自己的(通过简单地使用这里的示例代码),但我想使用现有的轮子,如果存在,而不是重新发明。

9 个答案:

答案 0 :(得分:10)

所以你需要像

这样的东西
interface Foo<T>
    bar(T)

JDK中只有3个接口就是那个

java.nio.file.DirectoryStream$Filter<T>

    boolean accept(T entry) throws IOException;


java.lang.Comparable<T>

    int compareTo(T o);


javax.xml.ws.Provider<T>

    T invoke(T request);

显然你不会喜欢他们。

Async IO有一个回调接口,但它有点复杂:

java.nio.channels.CompletionHandler<V,A>

    void completed(V result, A attachment);

    void failed(Throwable exc, A attachment);

答案 1 :(得分:4)

不,我不相信目前有这样的界面。在JDK 8中,目前预计会出现这样一个名为Block(带apply方法的接口),但名称可能会在现在和将来之间发生变化。

答案 2 :(得分:3)

这看起来像Guava的Function,除了允许函数返回一些东西。因此它看起来像

public interface Callback<T> extends Function<T, Void> {
}

不是JDK的一部分,但现在Guava非常常用,您可能会觉得它很方便。

答案 3 :(得分:2)

真正的问题是为什么?为什么您认为为此定义接口比使用Java提供的接口更糟糕?你会得到什么?您将无法选择适当的名称。我认为就是这样。如果您有理由使用Java库提供的现有接口,那么已经知道其名称,因为您将知道您计划与哪个库接口。 使用一种方法创建界面并不是重新发明轮子。

答案 4 :(得分:2)

根据我的经验,JDK中没有这样的界面。泛型只出现在Java游戏的后期。在此之前,需要以半类型安全的方式将几个类型化的参数传递给回调,而不需要事先了解这些参数结构(我说“半类型安全”,因为发明了事件监听器来测试事件的类型并按需要投射)。如果没有泛型,您就无法构建该机制,并且他们从未重新构建整个JDK以考虑泛型(除了集合API和其他一些)。这将是一项巨大的任务,收益甚微(毕竟, 的所有工作都按预期工作)。

因此,观察者/监听器模式在JDK库上普遍存在(参见java.util.EventObjectjava.util.EventListerner及其用法)。在实现EventListener时,Java还认为在接口定义期间更加冗长。为了更清晰的实现,该模式的专门实现应该使回调方法名称演示代码的目的(通常也匹配事件的名称)。例如,ActionEvent#actionPerformed(ActionEvent e)

缺少该接口的另一个可能原因是它不在JDK本身中使用。有时你希望Callback<T>Callback<T, V>Callback<T, R, V>其他人,等等。提供那些没有任何实际的接口的用例(在JDK内部)实际上不是一个非常设计的策略。缺乏对这些有用结构的支持是Guava和Apache Commons(以及其他)存在的主要原因。

无论如何,我同意@JB Nizet你应该使用番石榴。我们没有说明你使用界面的原因和方式,因此留下了很大的推测空间,但无论如何,Guava可能还有其他可能派上用场的功能。

答案 5 :(得分:1)

如果您要应用Observer设计模式,Java自JDK 1.0以来就在其标准库中支持它。您正在寻找的接口是java.util.Observer。模式的另一面是java.util.Observable类。基本上,你扩展java.util.Observable,然后注册你的Observers(据我所知,Observer可以同时观察多个Observable)。这是非常古老的东西,所以要注意:没有泛型。

答案 6 :(得分:1)

我使用Callable(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Callable.html)在java中实现回调/仿函数。

interface Callable<V> {
    public V call();
}

您可以使用java.util.concurrent中的Executors来处理它。

答案 7 :(得分:1)

在Java 8中,the java.util.function.Consumer class完全符合您的要求。

它有一个非默认方法,它接受泛型类型并且不返回任何内容:

public interface Consumer<T> {

    void accept(T t);

    default Consumer<T> andThen(Consumer<? super T> after) {
        // ...
    }
}        

答案 8 :(得分:0)

它被称为注释处理。 JSR 269: Pluggable Annotation Processing API定义了API,它是JDK 6的一部分。您可以从herehere开始。