
1 sagaxu Feb 3, 2021 via Android 可以初始化为 null |
2 codehz Feb 4, 2021 类型擦除了,所以拿不到类型信息,自然无法初始化,变通的方法就是加一个 Class<T> clazz 的参数( |
3 chendy Feb 4, 2021 类型擦除,拿不到 T 的类型,无法设置 |
4 zpxshl Feb 4, 2021 via Android 可以的吧。用反射找到 t 真实类型,反射生成对应对象 |
5 yungo8 Feb 4, 2021 via Android 想了解下为什么想要设置一个默认值? |
6 zhzy0077 Feb 4, 2021 这几乎是唯一一种做到的方法: import java.lang.reflect.*; class Main { public static void main(String args[]) throws Exception { var baz = new Foo<Baz>() {}; System.out.println(baz.bar); } } class Baz { } class Foo<T> { T bar; public Foo() throws Exception { Type actualTypeArgument = ((ParameterizedType)this.getClass() .getGenericSuperclass()) .getActualTypeArguments() [0]; System.out.println(actualTypeArgument); Class<T> clazz = (Class<T>) actualTypeArgument; bar = clazz.newInstance(); } } 但是代价是必须在所有初始化的地方这么写 new Foo<Baz>() {} 而且 newInstance 也会假设一定有个无参构造函数。 最有名的使用场景就是 fastjson 的 TypeReference 了, fastjson 为了在运行时拿到泛型的信息,就通过这个传进来的 https://github.com/alibaba/fastjson/blob/master/src/main/java/com/alibaba/fastjson/TypeReference.java 你这个场景下其实构造函数传一个 Class<T>进来会更直接一点 |
7 EminemW Feb 4, 2021 via iPhone 先说为什么要这么做 |
8 Takamine Feb 4, 2021 via Android 你既然想给他初始值,那他就初始化时就是有类型的了,这为啥又要用泛型呢。 |
9 Jooooooooo Feb 4, 2021 具体说说场景, 感觉不是用泛型的地方 |
10 abcbuzhiming OP @yeqizhang @EminemW @Jooooooooo 因为这玩意如果不初始化,那么序列化为 json 后就是一个 null,因为某些前端限制,很难处理 null,它们希望这个东西至少序列化是个 {} |
11 palmers Feb 4, 2021 有初始值 不就有类型了吗? |
12 sydra Feb 4, 2021 @abcbuzhiming 在反序列化的接口里面增加一个空判断就可以了 |
13 Elroooo0Y Feb 4, 2021 @abcbuzhiming 这很简单啊 重写 getResult 方法 返回一个空对象 |
14 LGA1150 Feb 6, 2021 via Android 典型的 XY 问题 |