Home  >  Q&A  >  body text

When the java type is forced to be converted to generic type V, no error is reported?

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: No error is reported when running.

欧阳克欧阳克2661 days ago820

reply all(2)I'll reply

  • 大家讲道理

    大家讲道理2017-06-12 09:25:55

    Type erasure is Object, and no error will be reported when forced conversion to Object.

    reply
    0
  • phpcn_u1582

    phpcn_u15822017-06-12 09:25:55

    There will only be warnings during compilation and no errors will be reported. There are actually such forced transfers everywhere in the Java Collections Framework.
    But an error will be reported when running, if V is not Ambiguity or its parent class.

    reply
    0
  • Cancelreply