Хорошо, вы можете объявить, что метод возвращает Object
вместо String[]
... но это делает его сложнее использовать, а не проще.
- Вы не можете объявить, что метод может возвращать тип X или тип Y, если только X или Y не является супертипом другого (в этом случае могут быть возвращены и другие подтипы)
- Вы не можете объявить два метода, которые отличаются только типом возврата
Подумайте, как будет выглядеть вызывающий код, и я думаю, вы поймете, почему на самом деле проще быть последовательным.
Конечно, вы всегда можете создать свой собственный интерфейс OneOrMany
, который включает в себя общие операции и может иметь либо один элемент, либо несколько ... но, опять же, я не вижу преимущества. (Я могу увидеть преимущество в возвращении List<String>
или Iterable<String>
вместо массива.)
РЕДАКТИРОВАТЬ: увидев ваш комментарий к ответу Дилума, в ситуации, когда у вызывающей стороны есть ожидание одного элемента, я бы либо создал вспомогательные методы, которые позволяли бы выражать это для коллекций, либо просто два метода:
public Collection<String> getValues()
{
...
}
public String getSingleValue()
{
// Throws an exception if there's more than one
}
Последний может либо идти по первому методу, либо потенциально может быть оптимизирован для случая ожидания (и проверки) одного результата.
Таким образом, в коде , вызывающем , очень ясно, что вы ожидаете и почему, и подтверждение этого ожидания.
Я бы, наверное, не ввел бы новый интерфейс, поскольку это означало бы, что мне придется либо обернуть существующие классы коллекций, либо создать их подкласс (argh). В C # это просто, так как вы можете просто использовать метод расширения Single()
(наряду с SingleOrDefault
, FirstOrDefault
и т. Д.) ...