我在这里多次看过类似这样的问题,但有一个很大的区别。
在其他问题中,返回类型由参数确定。我想要/需要做的是通过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;
}
我只想确保在我搞砸之前有机会工作。提前谢谢。
答案 0 :(得分:20)
完成 CAN 。以下代码将起作用:
public byte BOOLEAN = 1;
public byte FLOAT = 2;
public static <Any> 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;
}
}
通过对返回类型使用泛型,任何Java方法都可以动态返回任何对象或基元类型。您可以根据需要命名通用名称,在这种情况下我将其称为“任意”。使用此代码可以避免在调用方法时转换返回类型。您可以使用如下方法:
byte[] data = new byte[] { 1, 5 };
boolean b = getParam(data);
data = new byte[] { 2, 5 };
float f = getParam(data);
如果没有这个技巧,你可以做的最好的事情是手动转换对象:
float f = (float)getParam(data);
Java动态返回类型可以减少样板代码。
答案 1 :(得分:17)
我不知道这些人在谈论什么。你失去了类型安全性,这是一个问题,但你可以通过泛型来轻松实现这一点......类似于:
public <T> T getSomething(...) { }
或
interface Wrapper<T> { T getObject(); }
public <T> Wrapper<T> getSomething(...) { }
后者促进了strategy pattern的可能性。将字节传递给策略,让它执行并检索输出。您将拥有字节策略,布尔策略等。
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;
}
}
您的示例代码虽然是一个不好的用例,但我不推荐它。你的方法没有多大意义。
答案 2 :(得分:12)
你不能这样做。 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实际上做了什么,你会得到一个类 施放异常。
答案 3 :(得分:1)
如果您真的只返回boolean
或float
,那么您可以做的最好的事情是Object
。
如果要返回变量对象,则必须选择具有最小公共超类的返回类型。基元没有超类,但它们将被装入对象表示(如Boolean
和Float
),它们具有共同的超类Object
。
答案 4 :(得分:1)
我的2美分,其中包含Google HTTP客户端的示例:
static public <Any> Any getJson(final String url, final Class<Any> parseAs) throws IOException {
HttpRequestFactory requestFactory
= HTTP_TRANSPORT.createRequestFactory(
(HttpRequest request) -> {
request.setParser(new JsonObjectParser(JSON_FACTORY));
});
HttpRequest request = requestFactory.buildRequest(HttpMethods.GET, new GenericUrl(url), null);
return request.execute().parseAs(parseAs);
}
可以这样使用:
HashMap<String, Object> out = HttpUtils.getJson( "https://api.qwant.com", HashMap.class);