我是Java的新手,我正在尝试使用通用类型类来获取用户输入并将其转换为不同的类型(包括整数,字符串,bigdecimal)。我在这里有3个问题。
-
我可以检查具有通用类型的类字段成员是否是字符串的实例,如果您在声明类对象时将T为字符串。
-
如果我可以测试1,是否可以将字符串值分配给具有通用类型的字段成员?
-
是否可以根据声明时设置的t将用户输入转换为不同的类型,例如,如果将t设置为整数,则类方法将知道我需要使用整数。parseint(用户输入)将其转换为转换,然后将其存储到类字段成员中?
任何人可以给上述问题提供解决方案或提示吗?
以下是我的代码。如果这种方法是不可能的,我有什么方法可以完成这项工作?
public class userInputReader<T> {
private T userInput;
public userInputReader()throws IOException
{
readUserInput();
}
private void readUserInput() throws IOException
{
BufferedReader userInputBReader = new BufferedReader(new InputStreamReader(System.in);
if(userInput instanceof String)
{
userInput = userInputBReader.readLine();
}
else if(userInput instanceof Integer)
{
userInput = Integer.parseInt(userInputBReader.readLine());
}
else if(userInput instanceof BigDecimal)
{
userInput = new BigDecimal(userInputBReader.readLine());
}
}
}
我是新来的,如果我做过的任何事情都违反了此处的规则,请指出,谢谢!
您需要了解,您在源代码中看到的内容与在编译输出中看到的内容之间存在区别。
使用上述代码表示写作
final UserInputReader<String> reader = new UserInputReader<>();
就是这样。这是很好的外部,您可以看到该实例可与String
类型一起使用。
但是内部那个类,有点不同。
问题是在汇编过程中删除了Java通用类型的信息,因此汇编后,UserInputReader
看起来像
public class UserInputReader {
private Object userInput;
...
我可以检查具有通用类型的类字段成员是实例吗 例如字符串,是否在声明时将t作为字符串设置为字符串 类对象。
当然可以,但这完全独立于使用通用类型。
如果我可以测试1,是否有可以将字符串值分配给 具有通用类型的现场成员?
正如您在上面的示例中看到的那样,班级字段将成为
private Object userInput;
是的,您可以为Object
分配任何想要的东西,这是所有人的母亲。
是否可以将用户输入转换为不同类型 根据声明时设置的t,例如,如果设置t 要成为整数,那么类方法将知道我需要使用 integer.parseint(用户输入)将其转换为转换,然后将其存储到 班级成员?
您已经使用instanceof
操作员已经这样做了。
但是,是userInput
是null
,直到您分配它,就无法以任何有意义的方式比较其类型。
这些检查
if (userInput instanceof String)
else if (userInput instanceof Integer)
else if (userInput instanceof BigDecimal)
当时将始终产生false
。您正在做的是
if (null instanceof String)
唯一可能的方法,如果您仍然想在施工点确定要处理的对象类型,则将构造函数传递给Class<?>
类型。
public class UserInputReader {
private final Class<?> clazz;
private Object userInput;
public userInputReader(final Class<?> clazz) throws IOException {
this.clazz = clazz;
readUserInput();
}
...
例如
final UserInputReader reader = new UserInputReader(String.class);
可以像
一样使用if (String.isAssignableFrom(this.clazz)) {
userInput = userInputBReader.readLine();
}
等等。
我在想,您可能想选择以下内容:
public void userInputReader(Class<T> tClass) throws IOException
{
readUserInput(tClass.newInstance());
}
private void readUserInput(T t) throws IOException
{
BufferedReader userInputBReader = new BufferedReader(new InputStreamReader(System.in);
if(t instanceof String)
...
这应该允许您测试通用字段的类型。我相信您已经有了其他两个问题的答案。