2016-09-13 5 views
1

私は親クラスで宣言され、この方法があります:次のように構成サービスメソッドが定義されている一般的な問題:Tはインターフェイスタイプを拡張します。型を拡張するオブジェクトを返すメソッドを呼び出せませんか?

protected <ConfigT extends LoadableConfig> ConfigT getConfig(final String configId) { 
    return (ConfigT)getConfigService().getConfig(configId, getDriver()); 
} 

を:

@SuppressWarnings("unchecked") 
@Override 
public <ConfigT extends LoadableConfig> ConfigT getConfig(String configId, WebDriver driver) { 

    //noinspection unchecked 
    Map<String,LoadableConfig> profile = profiles.get(getProfileName(driver)); 

    if(profile != null) { 
     return (ConfigT) profile.get(configId); 
    } 

    return null; 
} 

私が欲しい構成タイプはここにある:

public interface AccessibleConfig extends LoadableConfig, PolleableConfig { 
.... 
} 

このコード行は、互換性のない型エラーを投げています:

AccessibleConfig config = getConfig(ValidationPane.class.getCanonicalName()); 

これはどのように可能ですか? AccessibleConfigLoadableConfigです。呼び出されたメソッドは、戻り値の型がLoadableConfigを拡張する型であると宣言しました。私はjdk1.8.0_102.jdkを実行しています。このエラーはIntelliJで発生するだけでなく、コマンドラインからMavenでコンパイルするときにも発生します。私はLoadableConfigタイプを拡張する他の設定タイプでこれを行うことができます。

EDIT:

親クラス:

public abstract class AbstractLoadable<T extends AbstractLoadable<T>> { 

    private Map<String,LoadableConfig> profiles = new HashMap<>(); 

    protected <T extends LoadableConfig> T getConfig(final String configId) { 
     return (T) profiles.get(configId); 
    } 
} 

コンクリートクラス:

public class ConcreteLoadable extends AbstractLoadable { 

    public ConcreteLoadable(final String profileName) { 

     AccessibleConfig config = getConfig(ConcreteLoadable.class.getCanonicalName()); 
    } 

} 

とインタフェースタイプ:だから

public interface LoadableConfig { 
    Integer getLoadTimeoutInSeconds(); 
    void setLoadTimeoutInSeconds(final Integer loadTimeoutInSeconds); 
} 

public interface AccessibleConfig extends LoadableConfig { 
    Boolean getHoverOverAccessorWithJavascript(); 
    void setHoverOverAccessorWithJavascript(final Boolean hoverOverAccessorWithJavascript); 
    Boolean getClickAccessorWithJavascript(); 
    void setClickAccessorWithJavascript(final Boolean clickAccessorWithJavascript); 
} 

、この最小限の製造運動実際に、コンパイラエラーの原因を特定するのが実際に簡単になりました。私はこの質問への答えを以下に掲示しました。私は謙虚に、私が実際に完全な例を投稿していないことを認めます。

+0

どのようにこのことを示し、最小限、_complete_例についてはどうですか?ここには多くの緩やかな終わりがあります。 –

+1

名前付けに関する注記:規則では、タイプパラメータに**単一**文字を使用します。 ConfigTではなくTと呼んでください。若干経験豊富なJavaプログラマから混乱するものがあります。 – GhostCat

+0

@GhostCat大文字の大文字に拡張できますが、特殊なケースでは多くのパラメータが必要です。キャメルケースは最悪です。 –

答えて

1

私はこの問題を特定しました。親が反射的に汎用的であるため、具象クラスはそれ自身を親に渡す必要があります。私は親クラスのメソッドのジェネリックパラメータについて考えていて、親クラス自体に適用されているジェネリックパラメータについては考えていませんでした。

これに変更にConcreteLoadableニーズのためのクラス宣言は、コンパイルエラーを取り除くために:

public class ConcreteLoadable extends AbstractLoadable<ConcreteLoadable> { 

    public ConcreteLoadable(final String profileName) { 

     AccessibleConfig config = getConfig(ConcreteLoadable.class.getCanonicalName()); 
    } 

} 
関連する問題