2014-03-29 93 views
0

我收到編譯錯誤。我希望我的靜態方法返回一個創建並返回Event<T>對象的工廠。我怎樣才能解決這個問題?通用靜態工廠

import com.lmax.disruptor.EventFactory; 

public final class Event<T> { 

    private T event; 

    public T getEvent() { 

     return event; 
    } 

    public void setEvent(final T event) { 

     this.event = event; 
    } 

    public final static EventFactory<Event<T>> EVENT_FACTORY = new EventFactory<Event<T>>() { 

     public Event<T> newInstance() { 

      return new Event<T>(); 
     } 


    }; 

} 
+0

我沒有看到一個靜態方法... –

+0

所以...什麼是EventFactory?它看起來像你試圖使用它之前定義... – Makoto

+2

發佈編譯錯誤也可能有幫助 – bsd

回答

3

類的泛型參數不適用於靜態成員。

顯而易見的解決方案是使用方法而不是變量。

public static <U> EventFactory<Event<U>> factory() { 
    return new EventFactory<Event<U>>() { 
     public Event<U> newInstance() { 
      return new Event<U>(); 
     } 
    }; 
} 

在當前版本的Java中,語法更加簡潔。

可以使用存儲在靜態字段中的同一個EventFactory實例,但需要進行不安全的轉換。

+0

哦!你太快了。 – bsd

1

您有:

public final class Event<T> { 
    ... 
    public final static EventFactory<Event<T>> EVENT_FACTORY = ... 
} 

你不能做到這一點。 T是一種與Event<T>的特定實例關聯的類型,您不能在靜態上下文中使用它。

因爲這是一種奇怪的工廠實現,所以很難在不知道更多關於您正在嘗試做什麼的情況下爲您提供良好的備選選項。我想你可以這樣做(把它放在一個方法來代替):

public final class Event<T> { 
    ... 
    public static <U> EventFactory<Event<U>> createEventFactory() { 
     return new EventFactory<Event<U>>() { 
      public Event<U> newInstance() { 
       return new Event<U>(); 
      } 
     }; 
    }; 
} 

並調用它像:

EventFactory<Event<Integer>> factory = Event.<Integer>createEventFactory(); 

或者,如果你不想成爲明確的(你不」噸真的需要是,這裏):

EventFactory<Event<Integer>> factory = Event.createEventFactory(); 

你爲什麼不擺脫Event東西全靜態成員的,要麼保持工廠分離出來,如:

public final class GenericEventFactory<T> extends EventFactory<Event<T>> { 
    @Override public Event<T> newInstance() { 
     return new Event<T>(); 
    } 
} 

並且在適當情況下使用例如new GenericEventFactory<Integer>()

+1

''Event.createEventFactory()''''應該可以工作。 –

+0

@ TomHawtin-tackline確實。我想說明,但我補充說。 –