Java设置数组列表中对象的泛型值

cdmah0mi  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(88)

我有课

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<>();

现在我想写一个方法,它在第二个数组中查找一个名称,并将一个新值赋给该arrayList中第一个对象的示例

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

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

但是我不能让它工作。我需要在set()方法中用?写一些东西吗?
谢谢

eyh26e7m

eyh26e7m1#

你没有提供一个完整的例子,所以不确定哪一个对你有帮助。
如果您可以使用List<ValueObject<T>>,则为版本1,因为所有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);
    }
}

相关问题