Я собираюсь продемонстрировать в Scala, потому что у него есть REPL, где я могу тестировать, но та же семантика должна работать в Java.
import java.util._
val orig = new LinkedList[Int]
val theClone = orig.clone
В Scala REPL говорится, что theClone имеет статический тип Object
(вы можете привести его к Collection[Int]
или LinkedList[Int]
), но динамический тип клона по-прежнему LinkedList
.
Теперь я предполагаю, что вам нужен метод, который возвращает статический тип LinkedList
, когда он получает статический тип LinkedList
, и возвращает статический тип ArrayList
, когда он получает статический тип 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();
}