簡體   English   中英

迭代自定義對象的 Hashset 會引發 ClassCastException

[英]Iterating over a Hashset of custom objects throws ClassCastException

這是我的抽象 class 它包含從接口 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;
    }

}

這是發射器 class 的主要方法

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當前返回Set<Entry<K, V>> ,而不是應有的Set<K> 更改:

@Override
public Set<K> keysAsSet() {
    HashSet<K> hashSet = new HashSet<>();
    for (Entry<K, V> entry: entries) {
        hashSet.add(entry.getKey());
    }
    return hashSet;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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