Java 方法中的动态返回类型

2022-09-02 02:16:10

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

在其他问题中,返回类型由参数确定。我想要/需要做的是通过解析值来确定返回类型。根据我收集到的信息,以下内容可能有效: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;
}

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


答案 1

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

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

}

不过,您的示例代码是一个糟糕的用例,我不建议这样做。你的方法没有多大意义。


答案 2

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

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 动态返回类型可以减少样板代码。


推荐