2010-06-16 53 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。