我正在尝试使此代码工作半小时,但我不知道该如何解决。其他所有内容都没有抱怨,但是编译器不断对我大喊:configurable.value
与configurable.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;
}
}
最佳答案
问题在于,编译器无法识别value
和defaultValue
属于同一对象,因此它不知道它们具有相同的类型。一种解决方案是创建一个捕获类型的帮助器方法以从循环中调用:
<T> void resetValue(Configurable<T> configurable) {
configurable.value = configurable.defaultValue;
}
正如@chrylis指出的那样,更好的解决方案可能是在
Configurable
中添加实例方法:public void resetValue() {
this.value = this.defaultValue;
}