一个类,含有一个泛型属性 T,我尝试了几乎所有的办法,都不能再这个类生成对象的时候就给这个 T 一个默认值。搜了一圈,英文网站上说这是无法做到的???
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 问题
|