有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java设置ArrayList中对象的通用值

我有课

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

现在我想写一个方法,在第二个数组中查找一个名称,并为该数组列表中第一个对象的实例赋值

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

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

但我没法让它发挥作用。我需要写点什么吗?在set()方法中

谢谢()


共 (1) 个答案

  1. # 1 楼答案

    你没有提供一个完整的例子,所以不确定哪一个对你有帮助

    如果可以使用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);
        }
    }