0

我有一个关于java中异步方法调用的问题,特别是关于异步方法的响应值。

情况如下:

我要调用的异步方法是..

public void getSpeed(IResponseListener listener) {
....
}

监听器的界面是...

interface IResponseListener {
    public void response(ResponseEvent event);
}

当异步方法有响应值时调用此方法

我现在的问题是该类ResponseEvent具有response可以是任何类型的属性(boolean,float,String...)并且在接口的实现中IResponseListener我必须强制转换值......

IResponseListener listener = new IResponseListener {

    public void response(ResponseEvent event) {
        float f = (float)event.response;
    }
}

这是处理这个问题的好方法吗?我认为不好的是响应侦听器必须知道响应的类型!是否有更好的解决方案来处理想要给出响应的异步调用,即使响应可以是任何类型?

4

4 回答 4

2

我认为很多这些答案开始看起来像这样->

public interface Function<Args, Value>
{
  public Value call(Args args);
}

你的返回类型无关紧要——如果它可以返回多种类型,那么“多种类型”就是一种类型……考虑到你在看什么,我可以建议一种 JSON 类型吗?

现实情况是您不能期望您的处理程序提前知道类型,因此您需要指定它。无论是返回类型还是类都取决于您。

我可以很容易地看到做一个类层次结构:

public class ResponseString implements Function<Args, String>; 
public class ResponseNumber implements Function<Args, Number>;
...
public class ResponseType implements Function<Args, Type>;

或者只是创建一个包含您需要的所有信息的类型。总而言之,该方法可以定义它对类型的期望,并且您可以扩展它们。请记住,响应也可以是可以执行的功能。知道如何处理某事但不知道它是什么并没有错 ->

示例->

//Admittedly I'd probably have a "Procedure or VoidFunction interface as well".
public yourMethod(Function<String args, Function<String,?> handler)
{
  String hello = "hello";
  Function<String,?> function = handler.call(hello);
  function.call(hello); 
} 

我希望这有帮助。有时没有理由走这么远,有时有。您不知道类型 - 似乎您希望其他人会提供它,这可以在保持严格的同时为您做到这一点。

编辑:在一个框架中有这个的例子是:

  Applcation.openDialog(Dialog dialog, Callable<Boolean> onClose);

这将返回 true 的对话框清理并关闭,否则返回 false。我真的不在乎这里发生了什么,我确实在乎它告诉我是,关闭它,或者不。

于 2012-10-01T20:49:40.190 回答
1

使用 Java 泛型:

interface IResponseListener<T> {
    public void response(T response);
}

然后,在一个匿名类中:

IResponseListener listener = new IResponseListener<Float> {

    public void response(Float response) {
        float f = response;
    }
}
于 2012-10-01T20:11:52.387 回答
1

我不知道这是否正确,但是如果您要以不同的方式处理返回值,为什么不使用您期望的不同类型的对象重载响应方法。只是一个建议。。

interface InterfaceName{
    void response(float responseVal);
    void response(boolean responseVal);
    ...
}
于 2012-10-01T20:17:37.733 回答
0

我会按照@nico_ekito 所说的那样做......或者使用您现有的解决方案。您不知道结果类型是一个问题。

无论如何,您可以进行一些调整,让 ResponseEvent 类为您进行转换。

响应监听器.java

interface IResponseListener {
    void response(ResponseEvent event);
}

响应事件.java

public class ResponseEvent {

   private Object response;

   @SuppressWarnings("unchecked")
   public <T> T getResponse() {
       return (T)response;
   }

   public <T> void setResponse(T response) {
       this.response = response;
   }
}

用法:

IResponseListener listener = new IResponseListener() {
    public void response(ResponseEvent event) {
        float f = event.getResponse();
    } 
};

请注意,ClassCastException如果您的类型与您期望的不同,您将得到一个。

于 2012-10-01T20:40:47.753 回答