gpt4 book ai didi

java - 一般问题 : T extends interface type. 无法调用方法来返回扩展类型的对象?

转载 作者:行者123 更新时间:2023-12-01 09:30:27 26 4
gpt4 key购买 nike

我在父类中声明了这个方法:

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

}

以及接口(interface)类型:

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

}

关于java - 一般问题 : T extends interface type. 无法调用方法来返回扩展类型的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39474876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com