Java在ArrayList

时间:2017-12-28 20:55:26

标签: java generics arraylist methods

我上课了

 public class ValueObject<T> {
        private T value;

        public void setValue(T value){
          this.value = value
        }
    }

在另一个类中,我从第一个类中获得了一个对象数组

ArrayList<ValueObject<?>> valueObjects = new ArrayList<>();
ArrayList<String> valueNames = new ArrayList<>();

现在我想编写一个Methode,它在第二个数组中查找名称,并为该arrayList中第一个对象的实例分配一个新值

ValueObject<?> get(String name) {
        return valueObjects.get(valueNames.indexOf(name));
}

public <T> void set(String name, T value) {
     get(name).setValue(value);
}

但我不能让这个工作。我需要写点东西吗?在set()方法?

谢谢=)

1 个答案:

答案 0 :(得分:1)

您没有提供完整的示例,因此不确定哪个会对您有所帮助。

版本1,如果您可以使用List<ValueObject<T>>,因为所有ValueObjects都拥有相同的类型。

static class Lookup<T2> {

    List<ValueObject<T2>> valueObjects = new ArrayList<>();
    List<String> valueNames = new ArrayList<>();

    ValueObject<T2> get(String name) {
        return valueObjects.get(valueNames.indexOf(name));
    }

    public void set(String name, T2 value) {
        get(name).setValue(value);
    }
}

版本2,如果valueObjects确实包含ValueObject包含不同的类:

@SuppressWarnings("unchecked")
static class Lookup2 {

    List<ValueObject<?>> valueObjects = new ArrayList<>();
    List<String> valueNames = new ArrayList<>();

    /* unsafe get */
    ValueObject<?> get(String name) {
        return valueObjects.get(valueNames.indexOf(name));
    }


    /* set using unsafe get */
    public <T> void setUnsafe(String name, T value) {
        /* might add handling of runtime exceptions */
        ((ValueObject<T>)get(name)).setValue(value);
    }

    /* safe get when client knows class */
    <T> ValueObject<T> get(String name, Class<T> clazz) {
        /* might do instanceOf check here to throw custom exception */
        return (ValueObject<T>) valueObjects.get(valueNames.indexOf(name));
    }

    /* set using safe get */
    public <T> void set(String name, T value) {
        /* might add handling of runtime exceptions */
        get(name, (Class<T>) value.getClass()).setValue(value);
    }
}