Java 方法中的动态返回类型

新手上路,请多包涵

我在这里多次看到类似的问题,但有一个很大的不同。

在其他问题中,返回类型由参数决定。我想要/需要做的是通过 byte[] 的解析值确定返回类型。从我收集到的信息来看,以下方法可能有效:

 public Comparable getParam(String param, byte[] data) {
    if(param.equals("some boolean variable")
        return data[0] != 0;
    else(param.equals("some float variable") {
        //create a new float, f, from some 4 bytes in data
        return f;
    }
    return null;
}

我只是想确保在我搞砸任何事情之前它有机会工作。提前致谢。

原文由 Jon Egeland 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 901
2 个回答

你做不到。 Java 返回类型必须是固定的基本类型或对象类。我很确定你能做的最好的事情就是返回一个包装器类型,它有方法来获取各种可能的值类型,以及一个内部枚举,它说明哪个是有效的。

--- 编辑 --- 在 Danieth 的更正之后!

 public <Any> Any getParam(boolean b){
return((Any)((Boolean)(!b)));
}
public <Any> Any getParam(float a) {
 return((Any)((Float)(a+1)));
}
public <Any> Any getParam(Object b) {
 return((Any)b);
}
public void test(){
  boolean foo = getParam(true);
  float bar = getParam(1.0f);
  float mumble = getParam(this); // will get a class cast exception
}

您仍然会因装箱项目和检查返回值的类型而受到一些惩罚,当然,如果您的调用与 getParam 的实现实际执行的操作不一致,您将得到一个类强制转换异常。

原文由 ddyer 发布,翻译遵循 CC BY-SA 3.0 许可协议

我不知道这些人在说什么。你失去了类型安全,这是一个问题,但你可以使用泛型轻松实现这一点……就像:

 public <T> T getSomething(...) { }

或者

interface Wrapper<T> { T getObject(); }

public <T> Wrapper<T> getSomething(...) { }

后者促进了 策略模式 的可能性。将字节传递给策略,让它执行并检索输出。你会有字节策略、布尔策略等。

 abstract class Strategy<T> {
    final byte[] bytes;

    Strategy(byte[] bytes) { this.bytes = bytes; }

    protected abstract T execute();
}

然后

class BooleanStrategy extends Strategy<Boolean> {
    public BooleanStrategy(byte[] bytes) { super(bytes); }

    @Override
    public Boolean execute() {
        return bytes[0] != 0;
    }

}

不过,您的示例代码是一个糟糕的用例,我不推荐它。你的方法没有多大意义。

原文由 hisdrewness 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题