2010-06-16 20 views
1

爲什麼以下不能在Java中使用?它將工作在C#中:Java中的協變

public static final List<String> Split(String str, char delimiter) 
    { 
     if ((str == null) || "".equals(str)) 
     { 
      return new CopyOnWriteArrayList<String>(); 
     } 
    } 

我收到一個錯誤,說這個方法必須返回List。 CopyOnWriteArrayList實現List接口。爲什麼協變不適用於Java中的返回值?

+1

這確實在C#中有效嗎?如果'str'不是空的,返回什麼? – 2010-06-16 07:41:39

回答

10

看起來您忘記了爲else分支返回List<String>

+0

對!! !!編譯器錯誤....哈啊..在日蝕中的這些紅線都是該死的太暴露了 – 2010-06-16 04:55:46

+0

啊!那就對了。我以爲這是告訴我,我不能將CopyOnWriteArrayList 作爲列表返回。 – Blade3 2010-06-16 05:02:16

+0

我很沮喪,我不像以前那麼厲害。我應該已經看到了這一點......我需要停止如此依賴我的IDE。 – Meiscooldude 2010-06-16 05:10:22

1

你要麼明確地有一個else分支並且返回你想返回的任何東西(null可能?)。或者在方法結尾處有返回聲明。如果你沒有,你的程序也不會編譯。

0
從上面的正確答案

除了:

  1. 在Java中使用小寫的方法名(分割,而不是拆分)
  2. 爲什麼返回這麼重的對象的CopyOnWriteArrayList當你的字符串是空的?這就是你想要返回Collections.emptyList()的情況,其中沒有不必要地創建新對象(假設你不打算在之後將值添加到列表中)

其實,我會使用apache commons lang並且這樣做:

return Arrays.asList(
    StringUtils.stripToEmpty(myString) // converts null into "" 
           // and strips extra whitespace 
     .split(
      Pattern.quote(Character.toString(delimiter)) 
     ) 
) 

沒有if/else needed。