[英]Java - splitting String problem
我在用java拆分字符串时遇到了一个小问题,如下所示:
System.out.println(dexListMod.get(selNum-1).getClass().getName());
String dexListTempString = dexListMod.get(selNum-1);
第一行打印从Vector dexListMod中的selNum -1索引返回的Object的类名称。 这将在控制台中输出以下内容:
java.lang.String
第二行定义了相同对象的String,稍后再进行split(),但这就是问题所在,编译器说它们是不兼容的类型! 我是看错了这还是矛盾?
谢谢。
我假设dexListMod是一个无类型的列表,即对象列表,在这种情况下,编译器在编译时不知道dexListMod.get(selNum-1)是一个String。 在运行时,对象可以报告它实际上是一个字符串,这实际上是多态性。
您需要执行的操作是将其强制转换为类型或使用类型列表。 例如
if (dexListMod.get(selNum-1) instanceof String) {
String s = (String) dexListMod.get(selNum-1);
System.out.println(s);
}
问题在于,对于Java编译器而言,重要的是对象的静态类型,而不是运行时的实际类型。
同样,Java编译器拒绝以下示例:
SuperClass a = new SubClass1();
a.SomeMethodInSubClass1ButNotInBaseClass(); // fails
如果编译器允许这样做,您可能已经将其他内容分配给a
:
SuperClass a = new SubClass1();
a = new SubClass2(); // it doesn't have the method!
a.SomeMethodInSubClass1ButNotInBaseClass(); // would fail at runtime if allowed
在一般情况下,理论上不可能在编译时找到变量的确切运行时类型。 编译器保持保守,只是无法编译,而不是假设其正确性并可能在运行时失败(像Python这样的动态语言通常会选择相反的设计决策:假设正确性并在运行时可能失败)。
您的代码段实质上演示了同一件事,其中dexListMod.get
方法的返回类型可能是Object
,并且它返回String
实例(从Object
派生)。
如果您确定对象的运行时类型,则Java要求您明确说明该对象,并负责将其手动转换为所需的类型。 当然,强制转换可能会在运行时失败并引发异常。
如果尚未使用泛型,则列表将返回Object,则需要显式强制转换。
if(dexListMod.get(selNum-1) instanceof java.lang.String){
String dexListTempString = (String)dexListMod.get(selNum-1);
}
问题是在第二行中应该具有String类型。 您的向量尚未参数化。 所以编译器不知道您存储在其中的对象类型
如果将字符串存储在向量中,则需要将值强制转换为String类型
String dexListTempString = (String) dexListMod.get(selNum-1);
试试这个,看看它输出什么:
String dexListTempString;
System.out.println(dexListTempString.getClass().getName());
从该调用返回的对象的类型不必一定是String。 它可以返回一个对象。 即使该对象实际上是一个字符串(如对dexListMod.get(selNum-1).getClass()。getName()的调用所示),也必须首先将其强制转换为字符串,然后才能使用它。
您尚未声明dexListMod
的声明,但是我假设它没有任何泛型类型参数( Vector dexListMod
)或具有String
的超类型的类型参数,例如Vector<Object> dexListMod
。 此类声明的get
方法不会返回java.lang.String
,而是可以或可以不与String赋值兼容的超类型。 编译器强制执行静态分配兼容性,因此会显示此错误消息。
使用强制转换并最终使用类型检查来分配结果:
Object val = dexListMod.get(selNum - 1)
if (val == null || val instanceof String) {
// this if contains a check for null because null instanceof Type is always false.
// If you want only non-null Strings, then just use "if (val instanceof String)"
String dexListTempString = (String)val;
// ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.