是否存在类似于Callable但带参数的接口?

rai*_*tin 55 java interface

Java中是否有类似于Callable接口的接口,它可以接受其调用方法的参数?

像这样:

public interface MyCallable<V> {
  V call(String s) throws Exception;
}
Run Code Online (Sandbox Code Playgroud)

如果已经存在我可以使用的东西,我宁愿避免创建新类型.或者是否有更好的策略让多个客户端实现并插入可调用的例程?

复制自http://www.programmingforums.org/thread27905.html

Joa*_*uer 44

从Java 8开始,java.util.function一整套类似Function的接口.你特别要求的就是这个Function.

在Java 8之前,没有通用的内置接口,但有些库提供了它.

例如,Guava具有该方法Function<F,T>接口T apply(F input).它还在几个地方大量使用该接口.


Shi*_*kin 9

起初它认为这是通过接口完成的,但后来我发现它应该使用抽象类来完成.

我这样解决了:


编辑:最近我只是用这个:

    public static abstract class callback1<T>{
         public abstract  void run(T value);
    }

    public static abstract class callback2<T,J>{
         public abstract  void run(T value,J value2);
    }

    public static abstract class callback3<T,J,Z>{
         public abstract  void run(T value,J value2,Z value3);
    }


    public static abstract class callbackret1<R,T>{
         public abstract  R run(T value);
    }

    public static abstract class callbackret2<R,T,J>{
         public abstract  R run(T value,J value2);
    }

    public static abstract class callbackret3<R,T,J,Z>{
         public abstract  R run(T value,J value2,Z value3);
    }
Run Code Online (Sandbox Code Playgroud)

CallBack.java

public abstract class CallBack<TRet,TArg> {
    public abstract TRet call(TArg val);
}
Run Code Online (Sandbox Code Playgroud)

定义方法:

class Sample2 
{
    CallBack<Void,String> cb;
    void callcb(CallBack<Void,String> CB)
    {
     cb=CB; //save the callback
     cb.call("yes!"); // call the callback
    }
}
Run Code Online (Sandbox Code Playgroud)

使用方法:

sample2.callcb(new CallBack<Void,String>(){
        @Override
        public Void call(String val) {
            // TODO Auto-generated method stub
            return null;
        }
    });
Run Code Online (Sandbox Code Playgroud)

两个参数示例:CallBack2.java

public abstract class CallBack2<TRet,TArg1,TArg2> {
    public abstract TRet call(TArg1 val1,TArg2 val2);
}
Run Code Online (Sandbox Code Playgroud)

请注意,当您使用Void返回类型时,您必须使用return null; 所以这里有一个变种来修复,因为通常回调不会返回任何值.

void作为返回类型:SimpleCallBack.java

public abstract class SimpleCallBack<TArg> {
    public abstract void call(TArg val);
}
Run Code Online (Sandbox Code Playgroud)

void作为返回类型2 args:SimpleCallBack2.java

public abstract class SimpleCallBack<TArg1,TArg2> {
    public abstract void call(TArg1 val1,TArg2 val2);
}
Run Code Online (Sandbox Code Playgroud)

接口对此没有用.

接口允许多种类型匹配相同的类型.通过拥有一组共享的预定义函数.

抽象类允许其中的空函数稍后完成.在扩展或实例化.


Jos*_*f.B 5

我最近有同样的要求.正如其他人所解释的那样,许多lib确实提供了"功能"方法,但这些方法并没有引发异常.

一些项目提供解决方案的示例RxJava库,它们使用ActionX等接口,其中"X"为0 ... N,即调用方法的参数数量.他们甚至还有一个varargs接口,ActionN.

我目前的方法是使用一个简单的通用接口:

public interface Invoke<T,V>  {     
    public T call(V data) throws Exception;     
//  public T call(V... data) throws Exception;    
}
Run Code Online (Sandbox Code Playgroud)

第二种方法在我的情况下是优选的,但它在我的IDE中表现出可怕的"类型安全:通过varargs参数数据的潜在堆污染",这是另一个问题.

我正在研究的另一种方法是使用现有的接口,例如不抛出Exception的java.util.concurrent.Callable,以及在我的实现中,在未经检查的异常中包装异常.