通用 Return 类型
Generic Return Types
是否有更好的方法来编写此 getInput() 方法而不是检查每个可以传入的 class?
public Object getInput(String prompt, Class<?> type) {
System.out.print(prompt);
Scanner scn = new Scanner( System.in );
String str = scn.nextLine( );
if(type.equals(Integer.class))
return Integer.parseInt(str);
else if (type.equals(Double.class))
return Double.parseDouble(str);
else if (type.equals(Boolean.class))
return Boolean.parseBoolean(str);
else return type.cast(str);
}
它足够有效,但我想让它适用于大多数情况,而不必添加更多 else if 语句。除此之外,当我接受输入并将其分配给变量时,我需要转换为该类型。我有办法解决这个问题吗?
Invocation:
int num = (int)menu.getInput("Enter an integer: ", Integer.class);
有几种“可能”执行此操作的方法,但可能不会让您每次需要新输入类型时都修改“基本”输入法的方法之一是注入“将”工作流程解析为方法本身。
也就是说,创建一个泛型 interface
,它定义了一个“解析”方法,该方法可以采用特定类型的 String
和 return 值并将其传递给您的输入法, 例如...
import java.util.Scanner;
public final class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
Integer result = getInput("Please enter an integer: ", new IntParser());
}
public interface Parsable<T> {
public T parse(String value);
}
public class IntParser implements Parsable<Integer> {
@Override
public Integer parse(String value) {
return Integer.parseInt(value);
}
}
public <T> T getInput(String prompt, Parsable<T> parser) {
System.out.print(prompt);
Scanner scn = new Scanner(System.in);
String str = scn.nextLine();
return parser.parse(str);
}
}
现在,如果您不想每次都输入 getInput("Please enter an integer: ", new IntParser());
,您可以创建方便的方法来让您的生活更轻松,例如...
public int getIntInput(String prompt) {
return getInput(prompt, new IntParser());
}
现在,我可能会创建 class 来包含所有内容...
public class InputManager {
public interface Parsable<T> {
public T parse(String value);
}
public class IntParser implements Parsable<Integer> {
@Override
public Integer parse(String value) {
return Integer.parseInt(value);
}
}
protected Scanner scanner;
public InputManager(Scanner scanner) {
this.scanner = scanner;
}
public InputManager() {
this(new Scanner(System.in));
}
public <T> T getInput(String prompt, Parsable<T> parser) {
System.out.print(prompt);
String str = scanner.nextLine();
return parser.parse(str);
}
public int getIntInput(String prompt) {
return getInput(prompt, new IntParser());
}
}
可是我疯了
重要 - 这不涉及错误处理。例如,当无法解析结果时,我可能会使用 Parsable
return null
,否则您可能应该定义一个 ParsingException
以便调用知道它们职责
也许你可以尝试使用反射,因为这些 类(Integer
, Boolean
...) 通常有一个静态 valueOf
方法:
public static void main(String[] args) {
int input = getInput("1", Integer.class);
System.out.println(input);
}
public static <T> T getInput(String input, Class<T> type) {
try {
Method valueOf = type.getMethod("valueOf", String.class);
return type.cast(valueOf.invoke(null, input));
} catch (Exception e) {
return null;
}
}
是否有更好的方法来编写此 getInput() 方法而不是检查每个可以传入的 class?
public Object getInput(String prompt, Class<?> type) {
System.out.print(prompt);
Scanner scn = new Scanner( System.in );
String str = scn.nextLine( );
if(type.equals(Integer.class))
return Integer.parseInt(str);
else if (type.equals(Double.class))
return Double.parseDouble(str);
else if (type.equals(Boolean.class))
return Boolean.parseBoolean(str);
else return type.cast(str);
}
它足够有效,但我想让它适用于大多数情况,而不必添加更多 else if 语句。除此之外,当我接受输入并将其分配给变量时,我需要转换为该类型。我有办法解决这个问题吗?
Invocation:
int num = (int)menu.getInput("Enter an integer: ", Integer.class);
有几种“可能”执行此操作的方法,但可能不会让您每次需要新输入类型时都修改“基本”输入法的方法之一是注入“将”工作流程解析为方法本身。
也就是说,创建一个泛型 interface
,它定义了一个“解析”方法,该方法可以采用特定类型的 String
和 return 值并将其传递给您的输入法, 例如...
import java.util.Scanner;
public final class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
Integer result = getInput("Please enter an integer: ", new IntParser());
}
public interface Parsable<T> {
public T parse(String value);
}
public class IntParser implements Parsable<Integer> {
@Override
public Integer parse(String value) {
return Integer.parseInt(value);
}
}
public <T> T getInput(String prompt, Parsable<T> parser) {
System.out.print(prompt);
Scanner scn = new Scanner(System.in);
String str = scn.nextLine();
return parser.parse(str);
}
}
现在,如果您不想每次都输入 getInput("Please enter an integer: ", new IntParser());
,您可以创建方便的方法来让您的生活更轻松,例如...
public int getIntInput(String prompt) {
return getInput(prompt, new IntParser());
}
现在,我可能会创建 class 来包含所有内容...
public class InputManager {
public interface Parsable<T> {
public T parse(String value);
}
public class IntParser implements Parsable<Integer> {
@Override
public Integer parse(String value) {
return Integer.parseInt(value);
}
}
protected Scanner scanner;
public InputManager(Scanner scanner) {
this.scanner = scanner;
}
public InputManager() {
this(new Scanner(System.in));
}
public <T> T getInput(String prompt, Parsable<T> parser) {
System.out.print(prompt);
String str = scanner.nextLine();
return parser.parse(str);
}
public int getIntInput(String prompt) {
return getInput(prompt, new IntParser());
}
}
可是我疯了
重要 - 这不涉及错误处理。例如,当无法解析结果时,我可能会使用 Parsable
return null
,否则您可能应该定义一个 ParsingException
以便调用知道它们职责
也许你可以尝试使用反射,因为这些 类(Integer
, Boolean
...) 通常有一个静态 valueOf
方法:
public static void main(String[] args) {
int input = getInput("1", Integer.class);
System.out.println(input);
}
public static <T> T getInput(String input, Class<T> type) {
try {
Method valueOf = type.getMethod("valueOf", String.class);
return type.cast(valueOf.invoke(null, input));
} catch (Exception e) {
return null;
}
}