我正在尝试使此代码工作半小时,但我不知道该如何解决。其他所有内容都没有抱怨,但是编译器不断对我大喊: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;
    }
}

最佳答案

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

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


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

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

10-04 21:02