实例化泛型类时的NoSuchMethodException

时间:2015-05-07 22:30:22

标签: java generics

我有一个课程如下:

public class StreamEventSuccess<T> {

    private final T event;

    public StreamEventSuccess(final T event) {
        this.event = event;
    }

    public T getEvent() {
        return event;
    }
}

我试着灌输它:

 StreamEventSuccess<BusinessEvent> success = new StreamEventSuccess<BusinessEvent>(event);

我得到了:

java.lang.NoSuchMethodError: com.ryan.protocol.StreamEventSuccess.<init>(Lcom/ryan/domain/event/BusinessEvent;)V

知道为什么吗?

event参数的类型为BusinessEvent

1 个答案:

答案 0 :(得分:1)

如果出现以下情况,您所描述的问题就会发生:

  • your-library-version-1有一个构造函数StreamEventSuccess(BusinessEvent event)
  • 您有一个使用project-x编译的项目(或类)your-library-version-1
  • your-library-version-2被设为通用StreamEventSuccess(T event)
  • 您正在使用project-x运行your-library-version-2

如果是这种情况,只需重新编译调用新构造函数的类。

这是因为泛型形式的构造函数的实际类型是<init>(Ljava/lang/Object;)V,因此在生成该类之后必须重新编译依赖项,因为它们的字节码指向构造函数的旧(非泛型)版本{ {1}}