Java - 拆分字符串问题

时间:2010-11-11 10:19:00

标签: java type-conversion

我在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,以便稍后分割(),这就是问题,编译器说它们是不兼容的类型!我看错了,还是这个矛盾?

感谢。

7 个答案:

答案 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;
  // ...
}