java - 迭代自定义对象的 Hashset 会引发 ClassCastException
问题描述
这是我的抽象类,其中包含从接口 Readablemap 实现的 keysAsSet() 方法
public abstract class AbstractReadableMap<K, V> implements ReadableMap {
protected Entry<K, V>[] entries;
public AbstractReadableMap(Entry<K, V>[] entries) {
this.entries = GenericArrayHelper.copyArray(entries);
}
public AbstractReadableMap() {
this.entries = GenericArrayHelper.newEntryArrayOfSize(10);
}
@Override
public Object getOrThrow(Object key) throws UnknownKeyException {
for(Entry<K, V> entry :entries)
{
if(entry!=null && entry.getKey().equals(key))
return entry.getValue();
throw new UnknownKeyException();
}
return null;
}
@Override
public ImmutableMap asImmutableMap() {
return new ImmutableMap<>(entries);
}
@Override
public Set keysAsSet() {
HashSet<Entry<K, V>> hashSet = new HashSet<>();
for(Entry<K, V> entry : entries)
{
if(entry!=null)
hashSet.add(entry);
}
return hashSet;
}
}
这是带有 main 方法的启动器类
public class Launcher {
public static void main(String[] args) {
MutableMap<String, Integer> map = new MutableMap<>();
putEntries(map);
printEntries(map);
ImmutableMap<String, Integer> immutableMap = map.asImmutableMap();
printEntries(immutableMap);
}
private static void putEntries(WritableMap<String, Integer> writableMap) {
writableMap.put("sizeInMB", 42);
writableMap.put("version", 4);
writableMap.put("yearOfrelease", 2015);
}
private static void printEntries(ReadableMap<String, Integer> readableMap) {
StringBuilder stringBuilder = new StringBuilder();
for (String keyString : readableMap.keysAsSet()) {
stringBuilder.setLength(0);
stringBuilder = new StringBuilder();
stringBuilder.append(keyString);
stringBuilder.append(": ");
try {
stringBuilder.append(readableMap.getOrThrow(keyString));
System.out.println(stringBuilder.toString());
} catch (UnknownKeyException e) {
System.out.println("Error rip");
}
}
}
}
这是错误
Exception in thread "main" java.lang.ClassCastException: class Entry cannot be cast to class java.lang.String (Entry is in unnamed module of loader 'app'; java.lang.String is in module java.base of loader 'bootstrap')
at Launcher.printEntries(Launcher.java:23)
at Launcher.main(Launcher.java:6)
解决方案
您keysAsSet
当前返回的是 a Set<Entry<K, V>>
,而不是Set<K>
应该返回的 a 。更改:
@Override
public Set<K> keysAsSet() {
HashSet<K> hashSet = new HashSet<>();
for (Entry<K, V> entry: entries) {
hashSet.add(entry.getKey());
}
return hashSet;
}
推荐阅读
- amazon-web-services - s3 同步以复制整个存储桶数据 + 所有其他 s3 配置
- python - 无法将 R 分析输出移回 Python (rpy2)
- graphql - 我应该如何在 GraphQL 查询中引用祖父属性,我没有定义中间解析器?
- python - 每当用户填写表单时,想要创建唯一并自动填充模型的值
- javascript - 使用正确的 url 附加 iframe
- python - 在 Pandas 中,给出一个日期时间索引,在所有工作日都有行,如何确定一行是一周的开始还是一周的结束?
- swift - 如何返回我的服务器提供的承载令牌
- r - 如何在 R 中缩放中心为 100 的数据集?
- database - 如何从单独的表中的同一记录自动填充表中的多个字段?
- javascript - 如何将数组的最后两个索引数据一起显示为单个数据?