在以下代码片段中,我想指定:
attachment
和handler
共享一个通用类型`<A>
的类型只需在调用notify()
时指定notify()
是可选的。我不想强迫用户在课程构建时指定<A>
,因为他们可能永远不会最终调用notify()
。
/**
* Builder pattern for some asynchronous operation.
*/
public class OperationBuilder
{
private A attachment = null;
private CompletionHandler<Integer, A> handler = null;
public <A> OperationBuilder notify(A attachment, CompletionHandler<Integer, A> handler)
{
this.attachment = attachment;
this.handler = handler;
return this;
}
public abstract build();
}
这可能在Java下吗?如果没有,你会建议我做什么?
更新:我无需指定与<A>
关联的attachment
和handler
必须与<A>
相关联notify()
{1}}。我要指的是,attachment
和handler
必须使用相同的类型<A>
。
答案 0 :(得分:2)
public class OperationBuilder
{
private Object attachment = null;
private Object handler = null;
public <A> OperationBuilder notify(A attachment, CompletionHandler<Integer, A> handler)
{
this.attachment = attachment;
this.handler = handler;
return this;
}
}
如果您想稍后使用attachment
/ handler
,那么您必须在那时将它们转换为适当的类型,这可能会导致运行时类型转换错误。
答案 1 :(得分:2)
您可以做的最接近的事情是让notify()返回一个用A
键入的桥对象。这些方面的东西:
public class OperationBuilder
{
public Bridge<A> OperationBuilder notify(A a, CompletionHandler<Integer, A> h)
{
return new Bridge<A>(a, h);
}
protected abstract<A> void build(Bridge<A> b);
public class Bridge<A>
{
private A attachment;
private CompletionHandler<Integer, A> handler;
public Bridge(A a, CompletionHandler<Integer, A> h)
{
attachment = a;
handler = h;
}
public void build()
{
build(this); // Will invoke OperationBuilder.build()
}
}
}
答案 2 :(得分:1)
这在Java下可能吗?
否 - A
必须为该类所知(因为它在所述类的成员中使用)。
如果没有,你会建议我做什么?
您可能不需要这里的通用类型。使用界面或Object
。如果类型安全对于界面很重要,您可以简单地使用强制转换。