为何Jackson的TypeReference是全方法实现的抽象类而非普通类?
Jackson的TypeReference设计成所有方法都已实现的抽象类,核心目的是强制开发者通过匿名内部类的方式实例化,以此保留泛型类型信息,具体原因拆解如下:
规避Java泛型擦除的限制
Java泛型在编译阶段会擦除具体类型信息,直接实例化普通泛型类时(比如new TypeReference<List<String>>()),编译后List<String>会被擦除成List,运行时无法获取到String这个实际类型参数。但如果是抽象类,开发者必须写成new TypeReference<List<String>>() {}(创建匿名子类),此时这个子类的字节码会携带父类的泛型参数信息,Jackson就能通过getGenericSuperclass()方法解析出真正的泛型类型。防止无意义的直接实例化
如果做成普通类,开发者可能误写new TypeReference(),此时这个实例没有绑定任何具体泛型类型,完全起不到TypeReference的作用。抽象类直接禁止了这种无效实例化,从API层面避免误用。明确API的语义定位
抽象类的语义天然传递了“这个类需要被继承使用”的信号,清晰告诉开发者:TypeReference的存在价值就是作为泛型类型的“捕获容器”,而非普通工具类。这种设计让API的用途一目了然,减少理解成本。
对比你提到的MyClass2(全实现抽象类)和MyClass3(普通类):如果MyClass2是泛型类,那么只有通过new MyClass2<SomeType>() {}的方式,才能在运行时拿到SomeType的类型信息;而MyClass3作为普通类,直接new MyClass3<SomeType>()无法保留这个类型,也就失去了类似TypeReference的核心作用。
内容的提问来源于stack exchange,提问作者nik

