Lorsque le type Java est forcé d'être converti en type générique V, aucune erreur n'est signalée ?
欧阳克
欧阳克 2017-06-12 09:23:55
0
2
884
public class StrictMap<V> extends HashMap<String, V> {

    private static final long serialVersionUID = -3455861209780003757L;

    private String name;

    public StrictMap(int initialCapacity, float loadFactor, String name) {
        super(initialCapacity, loadFactor);
        this.name = name;
    }

    public StrictMap(int initialCapacity, String name) {
        super(initialCapacity);
        this.name = name;
    }

    public StrictMap(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public V put(String key, V value) {
        if (containsKey(key)) {
            throw new RuntimeException("已经存在的key, keyName = " + key);
        }

        if (key.contains(".")) {
            final String shortName = getShortName(key);
            if (containsKey(shortName)) {
                // question 这边有个问题, 为什么没有抛出ClassCastException。
                V ambiguity = (V) new Ambiguity("存在的shortName");
                super.put(shortName, ambiguity);
            } else {
                super.put(shortName, value);
            }
        }

        return super.put(key, value);
    }

    @Override
    public V get(Object key) {
        V value = super.get(key);
        if (value == null) {
            throw new RuntimeException("keyName = " + key + ", 没有获取到value.");
        }
        if (value instanceof Ambiguity) {
            throw new RuntimeException("重复的shortName");
        }
        return value;
    }

    static class Ambiguity {
        private String name;

        public Ambiguity(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }
}

ps : Aucune erreur n'a été signalée lors de l'exécution.

欧阳克
欧阳克

温故而知新,可以为师矣。 博客:www.ouyangke.com

répondre à tous(2)
大家讲道理

L'effacement de type est Objet, et aucune erreur ne sera signalée lors de la conversion forcée en Objet.

phpcn_u1582

Il n'y aura que des avertissements lors de la compilation et aucune erreur ne sera signalée. Le Java Collections Framework regorge en fait de tels transferts forcés.
Mais une erreur sera signalée lors de l'exécution, si V n'est pas Ambiguity ou sa classe parent.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal