簡體   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