gpt4 book ai didi

Java泛型类,可以使用工厂生成的自己的产品

转载 作者:行者123 更新时间:2023-12-02 03:41:58 25 4
gpt4 key购买 nike

抱歉,有线标题,但它归结为这一点......

问题可以这样描述:

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

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

(无法更改)

到目前为止很简单,但现在产品本身可以配置:

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

(无法更改)

现在 worker 是由工厂生成的(在现实生活中工厂本身是使用配置文件创建的)

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

worker 的例子可能是:

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 .

最佳答案

如果你有不同的工厂返回不同的 worker ,那么你会得到类似的东西:

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

关于Java泛型类,可以使用工厂生成的自己的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36737841/

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