私は親クラスで宣言され、この方法があります:次のように構成サービスメソッドが定義されている一般的な問題: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());
これはどのように可能ですか? AccessibleConfig
はLoadableConfig
です。呼び出されたメソッドは、戻り値の型が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);
}
、この最小限の製造運動実際に、コンパイラエラーの原因を特定するのが実際に簡単になりました。私はこの質問への答えを以下に掲示しました。私は謙虚に、私が実際に完全な例を投稿していないことを認めます。
どのようにこのことを示し、最小限、_complete_例についてはどうですか?ここには多くの緩やかな終わりがあります。 –
名前付けに関する注記:規則では、タイプパラメータに**単一**文字を使用します。 ConfigTではなくTと呼んでください。若干経験豊富なJavaプログラマから混乱するものがあります。 – GhostCat
@GhostCat大文字の大文字に拡張できますが、特殊なケースでは多くのパラメータが必要です。キャメルケースは最悪です。 –