Search code examples
javadynamicreturn-type

Dynamic Return Type in Java method


I've seen a question similar to this multiple times here, but there is one big difference.

In the other questions, the return type is to be determined by the parameter. What I want/need to do is determine the return type by the parsed value of a byte[]. From what I've gathered, the following could work:

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

I just want to make sure that this has a chance of working before I screw anything up. Thanks in advance.


Solution

  • You can't do it. Java return types have to be either a fixed fundamental type or an object class. I'm pretty sure the best you can do is return a wrapper type which has methods to fetch various possible types of values, and an internal enum which says which one is valid.

    --- edit --- after Danieth's correction!

    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
    }
    

    You still incur some penalties for boxing items and type checking the returned values, and of course if your call isn't consistent with what the implementations of getParam actually do, you'll get a class cast exception.