构造一个返回由输入决定的原始数据类型的Java方法?
我想要一个方法来读取字符串,并以隐含(最佳拟合)数据类型返回它的值。我希望避免在“main”中进行字符串到数据类型的转换,因为代码可能会造成混乱。这可能吗?我可以创建一个返回不同类型的方法吗?构造函数是什么样子的?不可能返回不同的基元类型。您可以做的是将该方法声明为返回构造一个返回由输入决定的原始数据类型的Java方法?,java,Java,我想要一个方法来读取字符串,并以隐含(最佳拟合)数据类型返回它的值。我希望避免在“main”中进行字符串到数据类型的转换,因为代码可能会造成混乱。这可能吗?我可以创建一个返回不同类型的方法吗?构造函数是什么样子的?不可能返回不同的基元类型。您可以做的是将该方法声明为返回对象,并在运行时返回装箱原语:Integer、Double、Boolean,等等。单个Java方法不能返回多个类型。这是因为Java是一种强类型语言 有几种不同的方法可以实现这一点。如果您希望按照OP中提到的构造函数路线,它将如下
对象
,并在运行时返回装箱原语:Integer、Double
、Boolean
,等等。单个Java方法不能返回多个类型。这是因为Java是一种强类型语言
有几种不同的方法可以实现这一点。如果您希望按照OP中提到的构造函数路线,它将如下所示:
public class Demo(){
Demo(String str){
// Do something...
}
Demo(int newInt){
// Do something...
}
// Other constructors for other types here
}
您可以使用枚举类型对最终得到的类型进行分类。你没有说你想用它做什么,所以这可能不是最好的,但它可以用一种处理你给出的需求的方式来完成
public class ClassifiedType
{
public enum ClassifiedTypeType { INTEGER, FLOAT, STRING, BOOLEAN };
ClassifiedTypeType typeType = null;
int integerValue;
float floatValue;
String stringValue;
boolean booleanValue;
public ClassifiedType(int i) { integerValue = i; typeType = ClassifiedTypeType.INTEGER; }
public ClassifiedType(float f) { floatValue = f; typeType = ClassifiedTypeType.FLOAT; }
// etc.
public int getIntegerValue()
{
if (typeType != ClassifiedTypeType.INTEGER)
{
throw new IllegalArgumentException("Attempting getInteger on type of " + this.toString());
}
else
{
return integerValue;
}
}
// do gets for other types similarly.
public static ClassifiedType getClassifiedType(String string)
{
// parse the string, determine which type you want,
// instantiate a ClassifiedType with its value and
// and type, and return it.
}
}
其他类可以使用ClassifiedTypeType(希望有更好的名称)来确定从中获得什么样的值,只要它们需要
无论如何,它比返回对象,然后到处使用
instanceof
来找出您正在处理的内容要好得多,如果您需要,这将扩展到非原语。您需要如何处理此值?如果您最终进行了类型检查,那么即使复杂的转换本身已被隐藏,您也会回到混乱状态。这是一个非常糟糕的想法,因为唯一可能的返回类型是Object
,因此调用者有责任确定返回数据的类型。如果没有更多的上下文,这个问题真的是无法回答的,特别是一些您想如何使用它的示例,以及您已经考虑过返回对象的含义的证据。这将是我的方法。方便的方法,如isString()
,isInt()
,和getAsString()
,getAsInt()
等,可以减少/隐藏丑陋的类型转换。是的,我同意有更干净的方法可以做到这一点,但OP似乎希望避免手动检查代码中的数据类型。为了使用正确的助手方法,您需要进行一些手动转换。对于OP,我想指出,如果使用如上所示的构造函数方法,类型转换仍在幕后进行。如果你关心的是优化,这可能很重要。虽然这肯定是正确的,但我觉得它并没有完全回答op的全部问题。除非op提出后续问题,否则我没有任何其他补充。