Java - 如何将方法的返回类型作为参数传递?

时间:2018-02-13 13:02:30

标签: java

我正在尝试用TUI做一个小游戏。 TUI应该有data=<${file_data>方法,该方法应该使用get()和返回类型作为参数,因此您可以使用它来请求对象。

例如,String question应返回get("What is your name?", String),而String应返回get("What color do you want?", Color)

这就是我想出来的:

Color

不幸的是,public interface View { public <T> T get(String question, Class<T> type) throws InputException; } public class TUI implements View { public Color get(String question, Class<Color> type) { // code } public String get(String question, Class<String> type) { // code } } Color color = Game.getView().get("What piece do you want to place?", Color.class); 中的方法不被接受为公共TUI的实现。我有什么方法可以做到这一点吗?

4 个答案:

答案 0 :(得分:6)

通过拆分函数保持类型安全似乎更合适:

Color color = Game.getView().getColor("What piece do you want to place?");
String string = Game.getView().getString("What piece do you want to place?");

答案 1 :(得分:0)

尝试分别使用方法

创建两个实现View的类AskColor和AskString
  public Color get(String question, Class<Color> type) {
    // code
}

public String get(String question, Class<String> type) {
    // code
}

和界面View with method

public T get(String question, Class<T> type) throws InputException;

答案 2 :(得分:0)

您的TUI类无效,因为在类型擦除下,两个get方法都具有相同的参数。

您可能想要这样做:

public interface View<T> {
    T get(String question, Class<T> type) throws InputException;
}

public class ColorTUI implements View<Color> {
    public Color get(String question, Class<Color> type) {
        // code
    }
}

public class StringTUI implements View<String> {
    public String get(String question, Class<String> type) {
        // code
    }
}

答案 3 :(得分:0)

您可以使用类似于模板方法设计模式的内容。

public interface TypeTemplate {
    public Object get(String question);
}
public class ColorTemplate implements TypeTemplate {
    @Override public Color get(String question) { /*code for color*/ }
}
public class StringTemplate implements TypeTemplate {
    @Override public String get() { /*code for string*/ }
}

public class TUI {
    public Color get(String question, ColorTemplate templ) {
        return templ.get(String question)
    }
    public String get(String question, StringTemplate templ) {
        return templ.get(String question);
    }
}



public static void main(String args[]) {
    TUI tui = new TUI();
    String string = tui.get("What is your name?", new StringTemplate());
    Color color = tui.get("What color do you want?", new ColorTemplate());
}

您当然可以使用不太通用的内容替换Object中的TypeTemplate类型。你也可以使TypeTemplate一个抽象类;这样,如果所有(或某些)get()方法必须共享某些代码,您可以在此类中添加方法并从子类调用。 e.g。

public abstract class TypeTemplate {
    public abstract Object get(String question);
    protected void init() {/*some initialization code*/} 
    protected void cleanup(){/*some more code*/}
}
public class ColorTemplate implements TypeTemplate {
    @Override
    public Color get(String question) {
        init();
        /*code for color*/
        cleanup(); 
    }
}
public class StringTemplate implements TypeTemplate {
    @Override
    public String get() {
        init();
        /*code for string*/
        cleanup(); 
    }
}