java:参数化可运行

ggazkfy8  于 2021-07-05  发布在  Java
关注(0)|答案(6)|浏览(379)

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

interface MyRunnable<E> { public abstract void run(E reference); }

是否有任何标准接口用于此目的,或者我必须自己声明基本接口?

1sbrub3j

1sbrub3j1#

通常你会实现 Runnable 或者 Callable 作为支持泛型输入参数的类;例如

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

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

  public void run() {
    // Reference t.
  }
}
zte4gxcn

zte4gxcn2#

一般来说,如果要将参数传递到 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
    }
}
stszievb

stszievb3#

还有 com.google.common.base.Function<F, T> 来自google collectionsguava。
如果将输出类型设置为 ? 或者 Void (并且总是让它回来 null )你可以用它来代替 Runnable 输入参数。
这样做的好处是可以使用 Functions.compose 要转换输入值, Iterables.transform 将其应用于集合的每个元素等。

wlp8pajw

wlp8pajw4#

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

edqdpe6u

edqdpe6u5#

Java8包括 java.util.function.Consumer<T> 与单个非默认方法的接口 void accept(T t) .
该包中还有许多其他相关接口。

kknvjkwl

kknvjkwl6#

runnable并不意味着像这样的客户端代码可以直接调用 foo.run() 它将在当前线程中顺序运行。
从runnable api:
可运行接口应该由任何类实现,这些类的示例将由线程执行。该类必须定义一个名为run的无参数方法。
此接口旨在为希望在活动时执行代码的对象提供公共协议。例如,runnable是由类thread实现的。活动仅仅意味着线程已经启动,还没有停止。
此外,runnable提供了一种方法,使类在不将线程子类化的情况下处于活动状态。通过示例化线程示例并将自身作为目标传入,实现runnable的类可以在不将线程子类化的情况下运行。在大多数情况下,如果只计划重写run()方法而不打算重写其他线程方法,则应该使用runnable接口。这一点很重要,因为类不应该被子类化,除非程序员打算修改或增强类的基本行为。
相反,您可以基于runnable创建一个新的线程示例,然后调用 bar.start() . 然后jvm负责调用 run() 在这个单独的线程中。
例子:

public class Foo<E> implements Runnable {
     private final E e;
     public Foo(E e) { ... }
     @Override
     public void run() {
         do something with e.
     }
 }

 Foo<String> foo = new Foo("hello");
 Thread bar = new Thread(foo);
 bar.start();

相关问题