我收到了编译错误。我希望我的静态方法返回一个创建并返回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 :(得分:3)
类的通用参数不适用于静态成员。
显而易见的解决方案是使用方法而不是变量。
public static <U> EventFactory<Event<U>> factory() {
return new EventFactory<Event<U>>() {
public Event<U> newInstance() {
return new Event<U>();
}
};
}
当前版本的Java语法更简洁。
可以使用存储在静态字段中的EventFactory
的相同实例,但这需要不安全的转换。
答案 1 :(得分: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>()