我在java中拆分String时出现了一个小问题,如下所示:
System.out.println(dexListMod.get(selNum-1).getClass().getName());
String dexListTempString = dexListMod.get(selNum-1);
第一行打印从Vector dexListMod中的selNum -1索引返回的Object的类名。这将在控制台中输出以下内容:
java.lang.String
第二行定义了同一个Object的String,以便稍后分割(),这就是问题,编译器说它们是不兼容的类型!我看错了,还是这个矛盾?
感谢。
答案 0 :(得分:3)
我假设dexListMod是一个无类型列表,即一个Object列表,在这种情况下,编译器在编译时不知道dexListMod.get(selNum-1)是一个String。在运行时,Object可以报告它实际上是一个String,这是操作中的多态。
您需要做的是将其强制转换为类型或使用类型化列表。 e.g。
if (dexListMod.get(selNum-1) instanceof String) {
String s = (String) dexListMod.get(selNum-1);
System.out.println(s);
}
答案 1 :(得分:2)
问题是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要求您明确它并负责将其手动转换为您期望的类型。当然,强制转换可能会在运行时失败并抛出异常。
答案 2 :(得分:1)
如果你没有使用泛型,列表将返回Object,你需要一个显式的强制转换。
if(dexListMod.get(selNum-1) instanceof java.lang.String){
String dexListTempString = (String)dexListMod.get(selNum-1);
}
答案 3 :(得分:1)
问题在于,在第二行中,它应该具有String类型。您的矢量尚未参数化。所以编译器不知道你存储在哪种类型的对象
如果在向量中存储字符串而不是将值转换为字符串类型
String dexListTempString = (String) dexListMod.get(selNum-1);
答案 4 :(得分:0)
试试这个,看看它输出了什么:
String dexListTempString;
System.out.println(dexListTempString.getClass().getName());
答案 5 :(得分:0)
从该调用返回的对象的类型不一定必须是String。它可以返回一个Object。即使该Object实际上是一个String(如调用dexListMod.get(selNum-1).getClass()。getName())所示,它必须首先被转换为String,然后才能使用它。
答案 6 :(得分:0)
您尚未声明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;
// ...
}