在Map值中强制使用两种类型 - Java Generics

时间:2014-02-25 09:20:25

标签: java generics

我有一种情况,我需要使用Map,并将String作为关键字,StringLong作为值。

由于它们不属于同一层次结构,我认为我不能使用通配符。

那么有没有办法强制编译器接受StringLong作为值,或者我必须在没有泛型的情况下使用Map。< / p>

3 个答案:

答案 0 :(得分:4)

两种可能的解决方案是使用Map<String, Object>或创建类似

的类
public class DualValue {
    private final String stringValue;
    private final Long   longValue;

    public DualValue(final String stringValue) {
        this.stringValue = stringValue;
        this.longValue = null;
    }

    public DualValue(final Long longValue) {
        this.stringValue = null;
        this.longValue = longValue;
    }

    public String getStringValue() {
        return stringValue;
    }

    public Long getLongValue() {
        return longValue;
    }

    public boolean isString() {
        return stringValue != null;
    }

    public boolean isLong() {
        return longValue != null;
    }

    // next two are optional but should be implemented,
    // if you ever want to use this class as key of a Map

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        DualValue dualValue = (DualValue) o;

        if (longValue != null ? !longValue.equals(dualValue.longValue) : dualValue.longValue != null) {
            return false;
        }
        if (stringValue != null ? !stringValue.equals(dualValue.stringValue) : dualValue.stringValue != null) {
            return false;
        }

        return true;
    }

    @Override
    public int hashCode() {
        int result = stringValue != null ? stringValue.hashCode() : 0;
        result = 31 * result + (longValue != null ? longValue.hashCode() : 0);
        return result;
    }
} 

并使用Map<String, DualValue>。你是对的,编译器不能以另一种方式合并两个destinct class-hirachies和纯genric方法,而不是使用Object,它是每个Java类的共同父类。即使您可能需要使用value instanceof Stringvalue instanceof Long进行检查,并且如果您想要调用Object中不存在的值的任何函数,也可以转换为其中之一。< / p>

答案 1 :(得分:0)

我认为你只需要存储一个Object,这与没有泛型的存储非常相似(当然,仍然会检查String键,你不会得到编译器警告)。

答案 2 :(得分:0)

将您的长片转换为字符串然后您可以拥有<String,String>

的地图