簡體   English   中英

通用問題:T擴展接口類型。 無法調用方法返回擴展類型的對象?

[英]Generic issues: T extends interface type. Cannot call method to return an object which extends the type?

我在父類中聲明了此方法:

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類型的其他配置類型來執行此操作。

編輯:

家長班:

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);
}

因此,產生此最小示例的練習實際上使識別編譯器錯誤的根源變得非常容易。 我在下面發布了這個問題的答案。 我謙卑地接受我實際上並沒有最初發表一個完整的例子。

我發現了問題。 具體類需要將自身傳遞給父類,因為父類是自反通用的。 該錯誤消息並不是超級有用,因此我被束縛在考慮父類方法的通用參數而不是應用於父類本身的通用參數上。

需要將ConcreteLoadable的類聲明更改為此,以擺脫編譯錯誤:

public class ConcreteLoadable extends AbstractLoadable<ConcreteLoadable> {

    public ConcreteLoadable(final String profileName) {

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM