19

标准Runnable接口只有非参数化run()方法。还有与泛型类型Callable<V>的方法返回结果的接口。call()我需要传递通用参数,如下所示:

interface MyRunnable<E> {
  public abstract void run(E reference);
}
为此目的是否有任何标准接口,或者我必须自己声明那个基本接口?

4

5 回答 5

14

通常,您将实现RunnableCallable作为支持通用输入参数的类;例如

public class MyRunnable<T> implements Runnable {
  private final T t;

  public MyRunnable(T t) {
    this.t = t;
  }

  public void run() {
    // Reference t.
  }
}
于 2009-11-02T08:16:30.143 回答
11

Java 8 包含java.util.function.Consumer<T>带有单一非默认方法的接口void accept(T t)

该包中还有许多其他相关的接口。

于 2016-01-30T21:02:37.577 回答
9

还有com.google.common.base.Function<F, T>来自Google Collections Guava的。

如果您将输出类型设置为?or Void(并始终让它返回),您可以将其用作输入参数null的替代方案。Runnable

这具有能够用于Functions.compose转换输入值,Iterables.transform将其应用于集合的每个元素等的优点。

于 2009-11-02T11:22:38.750 回答
4

通常,如果您想将参数传递给run()方法,您将Runnable使用带有参数的构造函数进行子类化。

例如,你想这样做:

// code
Runnable r = new YourRunnable();
r.run(someParam);
//more code

你需要这样做:

// code
Runnable r = new YourRunnable(someParam);
r.run();
//more code

您将实现YourRunnable类似于以下内容:

public class YourRunnable implements Runnable {
    Some param;
    public YourRunnable(Some param){
        this.param = param;
    }
    public void run(){
        // do something with param
    }
}
于 2009-11-02T08:16:30.833 回答
0

我建议像在原始问题中那样定义一个接口。此外,通过使接口特定于它应该做的事情来避免弱类型,而不是像Runnable.

于 2009-11-02T10:05:41.867 回答