对不起,标题为有线,但归结为...

问题可以这样描述:

我有一个Worker<P>类,可以将其配置为产生“某些”产品。该Worker必须能够使用其自己的产品(并且只有其自己的产品,这是整个练习的重点):

interface Worker<P> {
    public P produce();
    public void consume( P p );
}


(无法更改)

到目前为止很容易,但是现在可以对产品本身进行配置:

interface ConfiguredProduct<T> {
    public T value();
}


(无法更改)

现在,工人是由工厂生成的(实际上,工厂本身是使用配置文件创建的)

static class Hatchery {

    public <X extends CharSequence, Y extends ConfiguredProduct<X>> Worker<Y> breed() {

        return new StringWorker(); // Type mismatch: cannot convert from Test.StringWorker to Test.Worker<Y>
    }
}


(可能会更改)

我喜欢以这种方式使用它:

public static <perhapse some wired arguments> void main( String [] args ) throws Exception {

    Hatchery hatchery = new Hatchery(); // Cannot be parametrized here

    Worker<T> worker = hatchery.breed();

    ConfiguredProduct<wired arguments> product = worker.produce();

    worker.consume( product );
}


工人的例子可能是:

static class StringWorker implements Worker<ConfiguredProduct<String>> {

    @Override
    public ConfiguredProduct<String> produce() {
        return () -> "Hello";
    }

    @Override
    public void consume( ConfiguredProduct<String> p ) {
        System.out.println( "Hello " + p.value() );
    }
}

static class StringBufferWorker implements Worker<ConfiguredProduct<StringBuffer>> {

    @Override
    public ConfiguredProduct<StringBuffer> produce() {
        return () -> new StringBuffer( "Hello" );
    }

    @Override
    public void consume( ConfiguredProduct<StringBuffer> p ) {
        System.out.println( "Hello " + p.value().toString() );
    }
}


甚至可以在没有狂放的情况下实现?我在我能想到的任何地方尝试了通用参数的每种组合,但确实在某一点或另一点产生了错误。

编辑:添加了不能更改部分的注释。在Hatchery中添加了用法和注释。

最佳答案

如果您有不同的工厂返回不同的工人,那么您将拥有类似的东西:

static interface Hatchery {
    public <X extends CharSequence, Y extends ConfiguredProduct<X>> Worker<Y> breed();
}

static class WorkerHatchery implements Hatchery{
    public   Worker<ConfiguredProduct<String>> breed(){
        return new StringWorker();
    }
}


然后这段代码可以正常工作

public static void main(String[] args) throws Exception {
    Hatchery hatchery = new WorkerHatchery();
    Worker<ConfiguredProduct<String>> worker = hatchery.breed();
    ConfiguredProduct<String> product = worker.produce();
    worker.consume(product);
}


编辑
如果您不想发出任何警告,则有另一种选择,您可以在类上移动泛型值,并且将有:

 interface Hatchery<X extends CharSequence, Y extends ConfiguredProduct<X>>{
       Worker<Y> breed();
    }

class WorkerHatchery implements Hatchery<String,ConfiguredProduct<String>> {
        public Worker<ConfiguredProduct<String>> breed() {
        return new  StringWorker();
    }
}

10-04 12:29
查看更多