[英]Invoking method on actual parameter not declared in formal parameter type
我是一位經驗豐富的程序員,但是Java初學者。 我有一個基准測試方法,可以接受Map類型的參數並對其進行一些測試。 可以在HashMap,Hashtable,IdentityHashMap,TreeMap等上調用它,因為它們都實現了Map。 它們也都實現了Cloneable,但是Eclipse告訴我不允許調用clone()方法。
private static double[] timeMapRemoves(Map<String,Integer> map,
Collection<String> data,
int reps) {
Map<String,Integer> map_clone = map.clone(); // OOPS -- "clone not accessible"
因此,我深入研究了Oracle網站,並提出了各種解決方案
Map<String,Integer> map_clone = null;
Method clone = null;
try {
clone = map.getClass().getMethod("clone", null);
map_clone = (Map<String,Integer>)clone.invoke(map, null);
} catch (NoSuchMethodException | SecurityException
| IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
e.printStackTrace();
}
我覺得我可能像Drool Rockworm一樣鑽研得太深,錯過了規范的解決方案。
clone()
protected
,這意味着只能從子類或相同的程序包訪問它。
從評論中重申:
這完全取決於調用它的上下文,如果該上下文是同一類型,則可以調用protected
方法。 這里的上下文是不同的類型,因此無法調用它。
例如,當您將參數更改為HashMap<K, V>
,您可以調用它,因為HashMap用公共修飾符覆蓋clone()
方法。 簡而言之:您無法使用簡單的Map<K, V>
聲明來做到這一點。
這意味着這樣的情況將起作用:
class X {
public X(){
X newX = new X().clone();
}
}
但這不會:
class X {
public X(){
String newString = "hello".clone();
}
}
但話又說回來,這將:
class X implements Map<String, String>{
public X(){
Map<String, String> map = new HashMap<>().clone();
}
}
這樣:
private static double[] timeMapRemoves(HashMap<String,Integer> map,
Collection<String> data,
int reps) {
Map<String, String> someMap = (Map<String, String>) map.clone();
}
注意如何將參數更改為HashMap<String,Integer>
。
其工作原理非常簡單: HashMap
定義了自己的clone()
方法。
public Object clone() {
HashMap<K,V> result = null;
try {
result = (HashMap<K,V>)super.clone();
} catch (CloneNotSupportedException e) {
// assert false;
}
result.table = new Entry[table.length];
result.entrySet = null;
result.modCount = 0;
result.size = 0;
result.init();
result.putAllForCreate(this);
return result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.