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; } 

我只想确保在我搞砸之前有机会工作。 提前致谢。

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

—编辑—经过Danieth的修正!

 public  Any getParam(boolean b){ return((Any)((Boolean)(!b))); } public  Any getParam(float a) { return((Any)((Float)(a+1))); } public  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实际执行的操作不一致,您将获得一个类强制转换exception。

这可以做到。 以下代码将起作用:

 public byte BOOLEAN = 1; public byte FLOAT = 2; public static  Any getParam(byte[] data) { if (data[0] == BOOLEAN) { return (Any)((Boolean)(boolean)(data[1] != 0)); } else if (data[0] == FLOAT) { return (Any)((Float)(float)data[1]); } else { return null; } } 

通过对返回类型使用generics,任何Java方法都可以动态返回任何对象或基元类型。 您可以根据需要命名通用名称,在这种情况下我称之为“任意”。 使用此代码可以避免在调用方法时转换返回类型。 你会使用这样的方法:

 byte[] data = new byte[] { 1, 5 }; boolean b = getParam(data); data = new byte[] { 2, 5 }; float f = getParam(data); 

没有这个技巧你可以做的最好的事情就是手动转换一个Object:

 float f = (float)getParam(data); 

Java动态返回类型可以减少样板代码。

我不知道这些人在谈论什么。 你失去了类型安全,这是一个值得关注的问题,但你可以通过generics来轻松实现这一点……例如:

 public  T getSomething(...) { } 

要么

 interface Wrapper { T getObject(); } public  Wrapper getSomething(...) { } 

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

 abstract class Strategy { final byte[] bytes; Strategy(byte[] bytes) { this.bytes = bytes; } protected abstract T execute(); } 

然后

 class BooleanStrategy extends Strategy { public BooleanStrategy(byte[] bytes) { super(bytes); } @Override public Boolean execute() { return bytes[0] != 0; } } 

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

如果你真的只返回一个boolean或一个float ,那么你能做的最好就是Object

如果要返回变量对象,则必须选择具有最小公共超类的返回类型。 基元没有超类,但它们将被装入Object表示(如BooleanFloat ),它们具有公共超类Object