Ковариация в Java - PullRequest
       1

Ковариация в Java

1 голос
/ 16 июня 2010

Почему следующее не работает в Java?Это будет работать в C #:

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

Я получаю сообщение о том, что этот метод должен вернуть List.CopyOnWriteArrayList реализует интерфейс List.Почему ковариация не применяется к возвращаемым значениям в Java?

Ответы [ 3 ]

10 голосов
/ 16 июня 2010

Похоже, вы забыли вернуть List<String> для else ветви.

1 голос
/ 16 июня 2010

У вас либо есть ветвь else в явном виде, и вы возвращаете все, что хотите вернуть (возможно, null?).Или иметь оператор возврата в конце метода.Ваша программа не будет компилироваться, если у вас ее нет.

0 голосов
/ 16 июня 2010

Помимо правильных ответов выше:

  1. использовать имена методов в нижнем регистре в Java (split вместо Split)
  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))
        )
)

Нет, если / еще нужно.

...