У меня есть необщий код вроде этого:Общий типа для аргумента, который также является возвращаемым значение
class List {
List intersect(List out, List other) {
if (out == null) out = new List();
// insert elements common to $this and $other into $out
return out;
}
}
Этого метода безопасно использовать смешанные типы содержащихся объектов:
other
может содержат объекты более конкретного типа (подкласс)out
может содержать объекты менее определенного типа (суперкласс)
. (А не от реального кода)
List<Number> my;
List<Integer> other;
List<Object> result = new();
result = my.intersect(result, other);
Что мне нужно, поэтому:
class List<T> {
<R super T> List<R> intersect(List<R> out, List<? extends T> other);
}
Однако это не компилируется. В FAQ Generics указано, что нижняя граница для параметра типа не имеет смысла, но я не вижу этого приведенного выше примера.
Ближайший я получаю:
List<? super T> intersect(List<? super T> out, List<? extends T> other);
Но это требует явного приведения возвращаемого значения на месте вызова.
Можно ли создать этот метод таким образом, чтобы он был безопасным для всех существующих обычаев?
UPDATE: В случае это не очевидно: (., Который является интерфейсом кстати) это не java.util.List но пользовательский класс. Исключительные части были опущены, но подпись метода точно такая же, как показано (за исключением уровня доступа).
UPDATE2: По типу безопасности я имею в виду как можно более ограниченные возможности. В идеале все параметры должны соблюдать оба правила, изложенные выше.
Является 'intersect' статический метод? Если нет, я немного смущен, почему есть сам экземпляр списка и 2 аргумента списка? –
Просто примечание: знаете ли вы о методе List.retainAll: http://download.oracle.com/javase/6/docs/api/java/util/List.html#retainAll%28java.util.Collection% 29 ? – Puce
Это не статично, и это не java.util.List –