我有一种情况,我需要使用Map
,并将String
作为关键字,String
或Long
作为值。
由于它们不属于同一层次结构,我认为我不能使用通配符。
那么有没有办法强制编译器接受String
或Long
作为值,或者我必须在没有泛型的情况下使用Map
。< / p>
答案 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 String
或value instanceof Long
进行检查,并且如果您想要调用Object
中不存在的值的任何函数,也可以转换为其中之一。< / p>
答案 1 :(得分:0)
我认为你只需要存储一个Object,这与没有泛型的存储非常相似(当然,仍然会检查String键,你不会得到编译器警告)。
答案 2 :(得分:0)
将您的长片转换为字符串然后您可以拥有<String,String>