繁体   English   中英

Java-拆分字符串问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM