繁体   English   中英

Java泛型返回类型

[英]Java generic return type

我想写一个方法,可以接受一个类型参数(或任何方法可以从中找出类型)并返回此类型的值,所以我不必转换返回类型。

这是一个方法:

public Object doIt(Object param){
    if(param instanceof String){
        return "string";
    }else if(param instanceof Integer){
        return 1;
    }else{
        return null;
    }
}

当我调用这个方法,并传入一个String时,即使我知道返回类型将是一个String我必须强制转换返回Object。 这类似于int param。

如何编写此方法来接受类型参数,并返回此类型?

如果你不想有一个特定的接口来处理那些东西你可以用这种方式使用泛型方法:

public <T> T mymethod(T type)
{
  return type;
}

请注意,通过这种方式,编译器不会知道您计划在该方法中使用的类型,因此您应该使用绑定类型,例如:

public <T extends YourType> T mymethod(T type)
{
  // now you can use YourType methods
  return type;
}

但是你应该确定你需要一个通用方法,这意味着doIt的实现对于你计划使用它的所有类型都是一样的。 否则,如果每个实现都不同只是重载方法,它将正常工作,因为返回类型不用于动态绑定:

public String my(String s)
{
  return s;
}

public int my(int s)
{
  return s;
}

int i = my(23);
String s = my("lol");

从这开始:

public interface Command<T>
{
    T execute(T parameter);
}

简短的回答是不。 一旦涉及到instanceof ,泛型通常是错误的答案。 改为使用重载方法:

public String doIt(String param){
    return "string";
}

public Integer doIt(Integer param){
    return 1;
}

public Object doIt(Object param){
    return null;
}

我会敦促你不要使用instanceof,但是这段代码可以满足您的需求:

public class Main
{
    public static void main(String[] args) 
    {
        final Main main;
        final String strVal;
        final Integer intVal;
        final Float   floatVal;

        main     = new Main();
        strVal   = main.doIt("Hello");
        intVal   = main.doIt(5);
        floatVal = main.doIt(5.0f);

        System.out.println(strVal);
        System.out.println(intVal);
        System.out.println(floatVal);
    }

    public <T> T doIt(final T thing)
    {
        T t;

        if(thing instanceof String)
        {
            t = (T)"String";
        }
        else if (thing instanceof Integer)
        {
            t = (T)Integer.valueOf(1);
        }
        else
        {
            t = null;
        }

        return (t);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM