gpt4 book ai didi

Java泛型通配符扩展问题

转载 作者:行者123 更新时间:2023-12-04 06:40:00 25 4
gpt4 key购买 nike

请你帮助我好吗?以下代码示例:

public abstract class AbstractWorker {  

public abstract void execute();

}

public class Config {

public final String name;

public Config(final String name) {
this.name = name;
}

}

public abstract class AbstractWorkerFactory<C extends Config> {

public abstract AbstractWorker createWorker(final C configuration);

}

public class Service {

public AbstractWorker caramba(final AbstractWorkerFactory<? extends Config> factory, final Config configuration) {
// it is not compile :(
return factory.createWorker(configuration);
}

}

以下代码有效
public <C extends Config> AbstractWorker caramba(final AbstractWorkerFactory<C> factory, final C configuration) {
return factory.createWorker(configuration);
}

但是使用 Service 的代码无法指定泛型类型。是否有可能的其他解决方案。
更新 (在meriton回答之后):
1. 集中Factory和Configuration实例在不同的地方(类)创建。
2.
public static class MegoConfig extends Config {

public static class WorkerFactory extends AbstractWorkerFactory<Config> {

public static class MegoWorkerFactory extends AbstractWorkerFactory<MegoConfig> {

MegoWorkerFactory 支持 MegoConfig 和 Config。
我的任务的新解决方案。
public AbstractWorker caramba(final AbstractWorkerFactory<? super MegoConfig> factory, MegoConfig configuration) {
return factory.createWorker(configuration);
}

new Service().caramba(new WorkerFactory(), new MegoConfig(""));
new Service().caramba(new MegoWorkerFactory(), new MegoConfig(""));

非常感谢大家的回答!

最佳答案

声明

public AbstractWorker caramba(final AbstractWorkerFactory<? extends Config> factory, final Config configuration) {

太宽泛了;它接受任何具有任何配置的 WorkerFactory,而不是表示每个 workerfactory 都需要特定的配置。也就是说,这样写是完全合法的
caramba(new AbstractWorkerFactory<FooConfiguration>() { ... }, new BarConfig());

即使该 WorkerFactory 无法使用该配置。

另一方面,声明
public <C extends Config> AbstractWorker caramba(final AbstractWorkerFactory<C> factory, final C configuration)

通过出现在两个参数声明中的相同类型变量,正确地表示提供的 WorkerFactory 必须与提供的配置兼容。

But code which uses Service couldn't specify generic type. Is it possible other solution?



我不明白;为什么不能?为什么需要另一种解决方案?

关于Java泛型通配符扩展问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4381521/

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