2016-11-30 3 views
0

私はこのコードを30分働かせようとしていますが、私はこれをどのように修正するべきかわかりません。他のすべては文句を言いませんが、コンパイラは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; 
    } 
} 
+3

LHSとRHSタイプの厳密な解釈にはおそらく問題があります。その問題を完全に 'protected void resetToDefault()'で回避することは明らかです。 – chrylis

答えて

1

問題はコンパイラがvaluedefaultValueが同じオブジェクトに属していることを認識していないということです、彼らは彼らが同じタイプを持っていることを知らない。一つの解決策は、あなたのループからコールするタイプ捕捉ヘルパーメソッドを作成することです:

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

@chrylisが指摘するように、より良い解決策は、おそらくConfigurableにインスタンスメソッドを追加することです:

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

または、それが所属する最初の場所に 'Configurable'を置く方がいいです。 – chrylis

+0

これはうまくいきます、ありがとうございます。 – 493msi

関連する問題