正确使用通用通配符

时间:2016-11-30 20:08:38

标签: java generics

我正试图让这段代码现在工作半小时,我不知道,我应该如何解决这个问题。其他一切都没有抱怨,但编译器一直在尖叫着我configurable.valueconfigurable.defaultValue的类型不同。我很困惑,因为?应该是一个通配符,对吗?

我对仿制药很新,所以我有点迷茫。我还没有找到任何解决方案。

是否有解决方案,不会产生任何警告或错误?

ConfigurationManager.class在这里:

public class ConfigurationManager
{
    private final List<Configurable<?>> config;

    public ConfigurationManager()
    {
        config = new ArrayList<Configurable<?>>();
    }

    public void register(Configurable<?> entry)
    {
        this.config.add(entry);
    }

    public void resetAll()
    {
        for(Configurable<?> configurable : this.config)
        {
            //Problem here
            //Type mismatch: cannot convert from capture#3-of ? to capture#2-of ?
            configurable.value = configurable.defaultValue;
        }
    }
}

Configurable.class在这里:

public class Configurable<T>
{
    ResourceAddress address;
    protected T value;
    protected final T defaultValue;

    public Configurable(ResourceAddress address, T defaultValue)
    {
        this.address = address;
        this.defaultValue = defaultValue;
        this.value = this.defaultValue;
    }

    public ResourceAddress getAddress()
    {
        return address;
    }

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

    public T getValue()
    {
        return value;
    }
}

1 个答案:

答案 0 :(得分:1)

问题是编译器没有识别出valuedefaultValue属于同一个对象,因此它不知道它们具有相同的类型。一种解决方案是创建一个类型捕获帮助器方法来从您的循环调用:

<T> void resetValue(Configurable<T> configurable) {
    configurable.value = configurable.defaultValue;
}

正如@chrylis所指出的,更好的解决方案可能是向Configurable添加实例方法:

public void resetValue() {
    this.value = this.defaultValue;
}