簡體   English   中英

未在形式參數類型中聲明的對實際參數的調用方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM