Java:如何限制通用性?

时间:2016-06-03 03:21:36

标签: java

我想创建一个只添加字符串或整数的列表。

List L = new ArrayList();
L.add("string");
L.add(8);

我知道List<Object> L,但我希望L只添加字符串或整数。

2 个答案:

答案 0 :(得分:0)

当然,最好的解决方案(从设计的角度来看)是像Elliott Frisch所建议的那样建立一个不可改变的类似联盟的类。对于奇怪的期望字符串获取整数错误,此选项具有最少的途径。

public class StringOrInt {
    public final Integer intVal;
    public final String stringVal;

    public StringOrInt(Integer i) {
        intVal = i;
        stringVal = null;
    }

    public StringOrInt(String s) {
        stringVal = s;
        intVal = null;
    }

    public boolean isEmpty() {
        return stringVal == null && intVal == null;
    }

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

    public boolean isInt() {
        return intVal != null;
    }

    public boolean equals(Object o) {
      if (! (o instanceof StringOrInt)) return false;
      StringOrInt s = (StringOrInt) o;

      return isInt() && intVal.equals(s.intVal) || isString() && stringVal.equals(s.stringVal);
    }

    public int hashCode() {
        if(isInt()) return intVal.hashCode();
        if(isString()) return stringVal.hashCode();
        return 0;
    }

    public String toString() {
        if(isInt()) return intVal.toString();
        if(isString()) return stringVal;
        return "EMPTY STRINGORINT";
    }
}

然后你可以简单地使用List<StringOrInt>,因为:

List<StringOrInt> lst = new ArrayList<>();
lst.add(new StringOrInt(5));
lst.add(new StringOrInt("Hello"));

答案 1 :(得分:0)

如果您有许多此类用例,最好考虑在答案和评论区域中使用其他建议;他们也很干净。但是,如果您只关心将int或字符串值添加到列表中:

  • 定义类似

    的方法
    public void add(final Object o, final List<Object> list) {
        if ((o instanceof String) || (o instanceof Integer)) {
            list.add(o);
        } else {
            throw new IllegalArgumentException("You can add only values of type String or Integer.");
        }
    }
    
  • 然后按如下方式调用:

    List<Object> stringsOrInts = new ArrayList<Object>();
    add(8, stringsOrInts);
    add("String", stringsOrInts);