gpt4 book ai didi

java - 对未在形式参数类型中声明的实际参数调用方法

转载 作者:行者123 更新时间:2023-12-01 13:10:56 25 4
gpt4 key购买 nike

我是一名经验丰富的程序员,但还是一名 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()带有 public 修饰符的方法。简而言之:你不能用简单的 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;
}

关于java - 对未在形式参数类型中声明的实际参数调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22875106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com