Я собираюсь продемонстрировать в Скале, потому что у него есть REPL, где я могу проверить, но тот же семан тики должны работать на Java.
import java.util._
val orig = new LinkedList[Int]
val theClone = orig.clone
Скала РЕПЛ говорит мне, что theClone имеет статический тип Object
(вы можете бросить это Collection[Int]
или LinkedList[Int]
), но динамический тип клона еще LinkedList
.
Теперь предположит, что вы хотите, это метод, который возвращает статический тип LinkedList
когда он recieves статического типа LinkedList
и возвращает статический тип ArrayList
когда он recieves статического типа ArrayList
и т.д., в этом случае
def doClone[C <: Collection[_]](orig:C) = {
val cloneMethod = orig.getClass.getDeclaredMethod("clone")
if (cloneMethod.isAccessible)
cloneMethod.invoke(orig).asInstanceOf[C]
else
throw new CloneNotSupportedException
}
в Java, я думаю, что это
<C extends Collection<?> > C doClone (C orig) {
java.lang.reflect.Method cloneMethod =
orig.getClass().getDeclaredMethod("clone");
if (cloneMethod.isAccessible())
return (C) cloneMethod.invoke(orig);
else
throw new CloneNotSupportedException();
}
Зачем вам нужна ваша выходная коллекция того же типа, что и входной? –
Если оригинальная коллекция не изменена? – Puce
@Nicolas: Вопрос удобства :) – Rnet