2010-01-19 6 views
1

В следующем коде sniplet, я хочу указать, что:Как объявить параметры типа на уровне поля?

  1. attachment и handler разделяют общий тип `
  2. «s тип
  3. <A> нужно только указать при notify() вызове
  4. Вызов 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? Если нет, что бы вы порекомендовали мне?

UPDATE: не нужно указывать, что <A>, связанные с attachment и handler должны быть одинаковыми <A> связаны с notify(). Все, что я пытаюсь указать, заключается в том, что attachment и handler должны использовать тот же тип <A>.

ответ

2

Самое близкое, что вы можете сделать, - это уведомить() о возврате объекта моста, который набирается с помощью 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() 
     }    
    } 
    } 
+0

Отличная идея! – Gili

1

Возможно ли это под Java?

Нет - A должны быть известны к классу (так как он используется в член указанного класса).

Если нет, что бы вы порекомендовали мне?

Вам, вероятно, не нужен общий тип здесь. Используйте интерфейс или Object. Если безопасность типа важна для интерфейса, вы можете просто использовать трансляции.

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, вы должны бросить их к соответствующему типу в то время, что может привести к ошибкам типа преобразования во время выполнения.

Смежные вопросы