1
sagaxu 2021-02-03 23:59:59 +08:00 via Android
可以初始化为 null
|
2
codehz 2021-02-04 00:02:44 +08:00
类型擦除了,所以拿不到类型信息,自然无法初始化,变通的方法就是加一个 Class<T> clazz 的参数(
|
3
chendy 2021-02-04 00:08:28 +08:00
类型擦除,拿不到 T 的类型,无法设置
|
4
zpxshl 2021-02-04 00:09:05 +08:00 via Android
可以的吧。用反射找到 t 真实类型,反射生成对应对象
|
5
yeqizhang 2021-02-04 00:49:40 +08:00 via Android
想了解下为什么想要设置一个默认值?
|
6
zhzy0077 2021-02-04 01:09:44 +08:00
这几乎是唯一一种做到的方法:
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 2021-02-04 09:11:16 +08:00 via iPhone
先说为什么要这么做
|
8
Takamine 2021-02-04 09:34:03 +08:00 via Android
你既然想给他初始值,那他就初始化时就是有类型的了,这为啥又要用泛型呢。
|
9
Jooooooooo 2021-02-04 10:16:11 +08:00
具体说说场景, 感觉不是用泛型的地方
|
10
abcbuzhiming OP @yeqizhang
@EminemW @Jooooooooo 因为这玩意如果不初始化,那么序列化为 json 后就是一个 null,因为某些前端限制,很难处理 null,它们希望这个东西至少序列化是个 {} |
11
palmers 2021-02-04 16:44:54 +08:00
有初始值 不就有类型了吗?
|
12
sydra 2021-02-04 16:46:06 +08:00
@abcbuzhiming 在反序列化的接口里面增加一个空判断就可以了
|
13
Elroooo0Y 2021-02-04 22:15:34 +08:00
@abcbuzhiming
这很简单啊 重写 getResult 方法 返回一个空对象 |
14
LGA1150 2021-02-06 13:44:57 +08:00 via Android
典型的 XY 问题
|