重构:将<string,double =“”>映射到Map <string,double =“”或=“”string =“”> </string,> </string,>

时间:2014-06-25 08:42:08

标签: java generics collections map

我有广泛使用的方法,如:

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>之外的任何想法?

5 个答案:

答案 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();
        }
    }