为了有用,在某些时候你将设置该foo
字段.此时你应该知道(或能够捕捉)T
.我建议在构造函数中执行此操作,然后Bar
有一个泛型参数是有意义的.您甚至可以使用接口,因此客户端代码不必查看类型.但是,我认为你不会接受我的建议,真的想要一个setFoo
.所以只需为可切换的实现添加一点:
/* pp */ class final BarImpl{ private final Foo foo; private T t; BarImpl(Foo foo) { this.foo = foo; } public void startStuff() { t = foo.getOne(); } public void finishStuff() { foo.useOne(t); } } public final class Bar { private BarImpl> impl; /* ... */ // Need to capture this wildcard, because constructors suck (pre-JDK7?). public void setFoo(Foo> foo) { setFooImpl(foo); } private void setFooImpl(Foo foo) { impl = new BarImpl (foo); } public void startStuff() { impl.startStuff(); } public void finishStuff() { impl.finishStuff(); } }