2010-11-11 117 views
1

我有一个小问题,在Java将字符串分割如下:爪哇 - 分割字符串问题

System.out.println(dexListMod.get(selNum-1).getClass().getName()); 
String dexListTempString = dexListMod.get(selNum-1); 

第一行打印对象的类名从selNum的指标返回-1 Vector dexListMod。这将输出以下控制台:

java.lang.String 

第二行定义了这个相同对象的字符串分割()之后,但,这就是问题所在,编译器说,他们是不兼容的类型!我看到这个错误,还是这是一个矛盾?

谢谢。

回答

3

我假定dexListMod是无类型列表,即对象在这种情况下,编译器不知道在编译时该dexListMod.get(selNum-1)是一个字符串的列表。在运行时,Object可以报告它实际上是一个String,这是多态行为。

你需要做的是将其转换为类型或使用类型化列表。例如

if (dexListMod.get(selNum-1) instanceof String) { 
    String s = (String) dexListMod.get(selNum-1); 
    System.out.println(s); 
} 
+0

唉唉......我得到它现在... – cortices 2010-11-11 10:30:24

+0

@iamthepiguy:如果有答案,帮助你,想想接受它,将您的问题标记为已回答。 – 2010-11-11 10:46:26

+0

对不起,不明白如何。 – cortices 2010-11-12 07:05:49

0

试试这个,看看它的输出:

String dexListTempString; 
System.out.println(dexListTempString.getClass().getName()); 
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需要您明确表示它并负责将其手动转换为您所期望的类型。当然,转换可能会在运行时失败并抛出异常。

0

从该调用返回的对象的类型不一定是字符串。它可以返回一个Object。尽管该对象实际上是一个字符串(如您对dexListMod.get(selNum-1).getClass()。getName())的调用所示),但必须首先将其转换为字符串,然后才能使用它。

1

如果您还没有使用泛型,则列表将返回Object,您将需要显式强制转换。

if(dexListMod.get(selNum-1) instanceof java.lang.String){ 
    String dexListTempString = (String)dexListMod.get(selNum-1); 
} 
1

问题是,在第二行中,它应该有一个字符串类型。您的向量尚未设置参数。所以编译器不知道你在它

存储哪些类型的对象如果您存储在矢量字符串比你需要的值转换为字符串类型

String dexListTempString = (String) dexListMod.get(selNum-1); 
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; 
    // ... 
}