gpt4 book ai didi

java - 是否有解决此错误的方法...Collections 类型中的方法 synchronizedSet(Set, Object) 不可见

转载 作者:行者123 更新时间:2023-12-01 22:55:51 25 4
gpt4 key购买 nike

我正在实现我在上面找到的哈希表功能 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Hashtable.java .

我已经逐字逐句地输入了整个源代码。然而,Eclipse 给了我三个错误:

  1. The method synchronizedSet(Set<T>, Object) from the type Collections is not visible
  2. The method synchronizedCollection(Collection<T>, Object) from the type Collections is not visible
  3. A duplicate error when calling synchronizedSet() again

以下是错误所在的代码:

public Set<K> keySet(){
if (keySet == null)
keySet = Collections.synchronizedSet(new KeySet(), this);
return keySet;
}

private class KeySet extends AbstractSet<K> {
public Iterator<K> iterator(){
return getIterator(KEYS);
}
public int size(){
return count;
}
public boolean contains(Object o){
return containsKey(o);
}
public boolean remove(Object o){
return HashTable.this.remove(o) != null;
}
public void clear(){
HashTable.this.clear();
}
}

public Set<Map.Entry<K, V>> entrySet(){
if (entrySet == null)
entrySet = Collections.synchronizedSet(new EntrySet(), this);
return entrySet;
}

private class EntrySet extends AbstractSet<Map.Entry<K, V>> {
public Iterator<Map.Entry<K,V>> iterator(){
return getIterator(ENTRIES);
}

public boolean add(Map.Entry<K,V> o) {
return super.add(o);
}

public boolean contains(Object o){
if (!(o instanceof Map.Entry))
return false;
Map.Entry entry = (Map.Entry)o;
Object key = entry.getKey();
Entry[] tab = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFF) % tab.length;

for (Entry e = tab[index]; e != null; e = e.next)
if (e.hash == hash && e.equals(entry))
return true;
return false;
}

public boolean remove(Object o){
if (!(o instanceof Map.Entry))
return false;
Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
K key = entry.getKey();
Entry[] tab = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFF) % tab.length;

for (Entry<K, V> e = tab[index], prev = null; e != null; prev = e, e = e.next){
if (e.hash == hash && e.equals(entry)){
modCount++;
if (prev != null)
prev.next = e.next;
else
tab[index] = e.next;
count--;
e.value = null;
return true;
}
}
return false;
}

public int size(){
return count;
}
public void clear(){
HashTable.this.clear();
}
}

public Collection<V> values(){
if (values == null)
values = Collections.synchronizedCollection(new ValueCollection(), this);
return values;
}

我调查了Collections来源以及 Set源代码,并为了我的生命找到解决方案。

最佳答案

synchronizedCollectionsynchronizedSet 的两个参数版本是包私有(private)方法,只能从 java.util 中的类访问包裹。您链接到的 grepcode.com 源是 Hashtable 的源,它是 java.util 包的一部分,因此可以使用这些方法。但你不能。

我唯一可以建议的是查看Collections源代码以了解它们是如何实现的,并尝试做类似的事情。

关于java - 是否有解决此错误的方法...Collections 类型中的方法 synchronizedSet(Set<T>, Object) 不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24070308/

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