通用静态工厂

时间:2014-03-29 04:20:03

标签: java generics

我收到了编译错误。我希望我的静态方法返回一个创建并返回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>();
        }


     };

}

2 个答案:

答案 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>()