ho intenzione di dimostrare a Scala, becuase ha un REPL dove posso provare, ma lo stesso Seman i tics dovrebbero funzionare in Java.
import java.util._
val orig = new LinkedList[Int]
val theClone = orig.clone
La Scala REPL mi dice che ha theClone tipo statico Object
(si può lanciare questo per Collection[Int]
o LinkedList[Int]
), ma il tipo dinamico del clone è ancora LinkedList
.
Ora suppongo quello che vuoi è un metodo che restituisce un tipo statico LinkedList
quando si riceve un tipo statico LinkedList
e restituisce un tipo statico ArrayList
quando si riceve un tipo statico ArrayList
, ecc nel qual caso
def doClone[C <: Collection[_]](orig:C) = {
val cloneMethod = orig.getClass.getDeclaredMethod("clone")
if (cloneMethod.isAccessible)
cloneMethod.invoke(orig).asInstanceOf[C]
else
throw new CloneNotSupportedException
}
in Java, io credo che sia
<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();
}
fonte
2011-02-02 14:39:28
Perché è necessario che la raccolta di output sia dello stesso tipo di quella di input? –
La collezione originale dovrebbe rimanere inalterata? – Puce
@Nicolas: Matter of convenience :) – Rnet