我有广泛使用的方法,如:
public Map<String, Double> parseData(String[] data) {
.................
其中data
类似于new String[] { "column1 -> 2.00", "column2 -> New York", ... }
问题:data
似乎可以同时包含:String -> Double
&amp; String -> String
值。所以我需要像:
public Map<String, String or Double> parseData(String[] data) {
................
问题:除了返回Map<String, Object>
之外的任何想法?
答案 0 :(得分:3)
创建一个包装StringOrDouble
,看起来有点像这样:
public class StringOrDouble {
private String internalString;
private Double internalDouble;
public StringOrDouble(String input) {
internalString = input;
}
public StringOrDouble(Double input) {
internalDouble = input;
}
public boolean hasString() {
return internalString != null;
}
public boolean hasDouble() {
return internalDouble != null;
}
public String getString() {
return internalString;
}
public Double getDouble() {
return internalDouble;
}
}
然后有一个Map<String, StringOrDouble>
类型的地图并使用它。使用这些值时,您可以通过hasString()
和/或hasDouble()
进行测试来检查它是哪一个。或者,您可以使用枚举来确定它的类型。
答案 1 :(得分:2)
public Map<String, Container> parseData(String[] data)
您可以为此
引入包装类public class Container {
private String s;
private Double d;
public Container(String s) {
this.s=s;
}
public Container(Double d) {
this.d=d;
}
public hasString() {
return s!=null;
}
public hasDouble() {
return d!=null;
}
//getters/setters
}
答案 2 :(得分:1)
据我所知,你想要Map<String, ? extends String || Double
之类的东西作为返回类型,但Java中不支持这样的东西:
4.9交叉点类型交叉点类型采用T1和amp;的形式。 ......&amp; Tn,n> 0,其中Ti,1in是类型表达式。出现交叉类型 在捕获转换(第5.1.10节)和类型推断的过程中 (§15.12.2.7)。无法编写交集类型 直接作为计划的一部分;没有语法支持这个。的价值观 交集类型是那些是所有的值的对象 类型Ti,1in。
因此,您最好解析输入数组并为每个不同的类型保存不同的数组,或者您可以使用包装类来表示返回的映射中的值,正如其他一些回答者所解释的那样。
答案 3 :(得分:0)
使用超类:
public Map<String, Object> parseData(String[] data)
答案 4 :(得分:0)
只是@blalasaadri的替代品。不要假装更好:
public static class StringDoubleValue {
private final Optional<String> sValue;
private final Optional<Double> dValue;
public MetricValue(String sValue) {
this.sValue = Optional.of(sValue);
this.dValue = Optional.absent();
}
public MetricValue(Double dValue) {
this.sValue = Optional.absent();
this.dValue = Optional.of(dValue);
}
public Object get() {
return (sValue.isPresent()) ? sValue.get() : dValue.get();
}
@Override
public String toString() {
if (sValue.isPresent()) ? sValue.get() : dValue.get().toString();
}
}