我的程序从文本文件加载信息,并创建一个对象数组,其中包含信息,无论是整数还是字符串。
然后我想让对象返回String或Integer,具体取决于对象是持有整数值还是字符串值。
...编辑 所以这里是我的类型类,如果文本文件中的字段是数字,则持有int;如果字段是单词,则持有字符串,并且它保存在Type数组中。
public class Type {
private String name;
private int value;
public Type(String name) {
this.name = name;
}
public Type(int value) {
this.value = value;
}
public String getName() {
return this.name;
}
public int getValue() {
return this.value;
}
public boolean isInt() {
boolean isInt = false;
if (this.value != 0) {
isInt = true;
return isInt;
}
return isInt;
}
}
所以在我的数组中可以是Int或String,我想在我的主类中返回没有任何长语句的数据类型。
答案 0 :(得分:2)
如果您只想获取特定值,可以在Type
类中添加一个方法并从此方法中获取值,这很丑陋但是可以做到你想要的:
public <T> T getDynamicValue(Type t) {
if (isInt()) {
return (T) ((Integer) t.getValue());
} else {
return (T) t.getName();
}
}
使用它:
List<Type> dynamicList = Arrays.asList(new Type[]{new Type(1), new Type(2), new Type("dog")});
for (Type t : dynamicList) {
System.out.println("T -> " + t.getDynamicValue(t));
}
如果你想对这些数据进行一些操作,你必须进行instanceof
检查并进行转换,例如使用名称值的一些拆分(或String方法)...
答案 1 :(得分:1)
您无法选择要在运行时返回的对象类型。您唯一的选择是返回Object
。您可以使用此代码检查它是String
还是int
,例如:
if(object instanceof String) {
//... it's a string
}
else {
//...otherwise it's an int
}
答案 2 :(得分:1)
如果要读取String实例的所有输入,则需要根据Integer.parseString(value)测试值,以确定它是否实际上是整数。
答案 3 :(得分:1)
您可以尝试将对象转换为Integer
并抓住ClassCastException
:
try {
int i = (Integer) object;
}
catch (ClassCastException e){
String s = (String) object;
}
答案 4 :(得分:1)
当我遇到这类问题时,我有时会通过解决问题和使用回调式解决方案来解决问题。
例如:
for ( Type t : array ) {
t.process( callback );
}
回调如下所示:
interface Callback {
public void processInt(....);
public void processString(....);
}
然后,您可以使用if (isInt()) callback.processInt() else callback.processString()
实现流程方法,或者如果更改Type
的定义,则可以使用继承树为您执行此操作。
例如:
interface Type {
public void process( Callback cb );
}
class IntType implements Type {
public void process( Callback cb ) {
cb.processInt(...);
}
}
class StringType implements Type {
public void process( Callback cb ) {
cb.processString(...);
}
}