Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型通配符扩展问题_Java_Generics - Fatal编程技术网

Java泛型通配符扩展问题

Java泛型通配符扩展问题,java,generics,Java,Generics,你能帮帮我吗?以下代码示例: public abstract class AbstractWorker { public abstract void execute(); } public class Config { public final String name; public Config(final String name) { this.name = name; } } public a

你能帮帮我吗?以下代码示例:

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

}
公共抽象类AbstractWorker{
公共抽象void execute();
}  
公共类配置{
公共最终字符串名;
公共配置(最终字符串名){
this.name=名称;
}  
}  
公共抽象类AbstractWorkerFactory{
公共抽象AbstractWorker createWorker(最终C配置);
}  
公共类服务{

public AbstractWorker caramba(final AbstractWorkerFactory这些都在同一个文件中吗?一个源文件中不能有多个公共类。不过,这不能解释泛型错误

我将它们与您的
服务
类一起放入一个源文件中,并得到了很好的编译:

class Config {}
class AbstractWorker {}
abstract class AbstractWorkerFactory<C extends Config> {
    public abstract AbstractWorker createWorker(final C configuration);
}
类配置{}
类AbstractWorker{}
抽象类AbstractWorkerFactory{
公共抽象AbstractWorker createWorker(最终C配置);
}

使用
服务的代码是什么?

不,您提供的解决方案可能是最好的:

public <C extends Config> AbstractWorker caramba(final AbstractWorkerFactory<C> factory, final C configuration) {
    return factory.createWorker(configuration); 
}
公共抽象工人caramba(最终抽象工人工厂,最终C配置){ 返回factory.createWorker(配置); }
或者,您可以在caramba方法中使用原始签名,而不使用通配符,但这会带来其他问题,例如编译器警告。

声明

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

public AbstractWorker caramba(final AbstractWorkerFactory)为什么使用服务的代码不能指定泛型类型?它有AbstractWorkerFactory,还是Java 1.4?嗨,非常感谢你的回答。我更新了帖子来回答你的问题。
public <C extends Config> AbstractWorker caramba(final AbstractWorkerFactory<C> factory, final C configuration) {
    return factory.createWorker(configuration); 
}
public AbstractWorker caramba(final AbstractWorkerFactory<? extends Config> factory, final Config configuration) {
caramba(new AbstractWorkerFactory<FooConfiguration>() { ... }, new BarConfig());
public <C extends Config> AbstractWorker caramba(final AbstractWorkerFactory<C> factory, final C configuration)