2010-11-11 86 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; 
    // ... 
}