如何声明字段级类型参数?

时间:2010-01-19 17:46:28

标签: java generics

在以下代码片段中,我想指定:

  1. attachmenthandler共享一个通用类型`
  2. <A>的类型只需在调用notify()时指定
  3. 调用notify()是可选的。
  4. 我不想强迫用户在课程构建时指定<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>关联的attachmenthandler必须与<A>相关联notify() {1}}。我要指的是,attachmenthandler必须使用相同的类型<A>

3 个答案:

答案 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。如果类型安全对于界面很重要,您可以简单地使用强制转换。