Tôi sẽ chứng minh trong Scala, bởi vì nó có REPL nơi tôi có thể kiểm tra, nhưng cùng một seman tics sẽ hoạt động trong Java.
import java.util._
val orig = new LinkedList[Int]
val theClone = orig.clone
Các Scala REPL nói với tôi rằng theClone có tĩnh loại Object
(bạn có thể dùng skill này cho Collection[Int]
hoặc LinkedList[Int]
), nhưng loại năng động của clone vẫn là LinkedList
.
Bây giờ tôi cho rằng những gì bạn muốn là một phương thức trả về một loại tĩnh LinkedList
khi nó nhận được một loại tĩnh LinkedList
và trả về một kiểu tĩnh ArrayList
khi nó nhận được một loại tĩnh ArrayList
, vv trong trường hợp này
def doClone[C <: Collection[_]](orig:C) = {
val cloneMethod = orig.getClass.getDeclaredMethod("clone")
if (cloneMethod.isAccessible)
cloneMethod.invoke(orig).asInstanceOf[C]
else
throw new CloneNotSupportedException
}
trong Java, tôi nghĩ đó là bộ lọc
<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();
}
Nguồn
2011-02-02 14:39:28
Tại sao bạn cần bộ sưu tập đầu ra của bạn giống loại đầu vào? –
Bộ sưu tập gốc có được giữ nguyên không? – Puce
@Nicolas: Vấn đề tiện lợi :) – Rnet