Java 就完全没有办法给泛型属性一个初始化的值吗?

2021-02-03 23:58:13 +08:00
 abcbuzhiming
一个类,含有一个泛型属性 T,我尝试了几乎所有的办法,都不能再这个类生成对象的时候就给这个 T 一个默认值。搜了一圈,英文网站上说这是无法做到的???
3513 次点击
所在节点    Java
14 条回复
sagaxu
2021-02-03 23:59:59 +08:00
可以初始化为 null
codehz
2021-02-04 00:02:44 +08:00
类型擦除了,所以拿不到类型信息,自然无法初始化,变通的方法就是加一个 Class<T> clazz 的参数(
chendy
2021-02-04 00:08:28 +08:00
类型擦除,拿不到 T 的类型,无法设置
zpxshl
2021-02-04 00:09:05 +08:00
可以的吧。用反射找到 t 真实类型,反射生成对应对象
yeqizhang
2021-02-04 00:49:40 +08:00
想了解下为什么想要设置一个默认值?
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>进来会更直接一点
EminemW
2021-02-04 09:11:16 +08:00
先说为什么要这么做
Takamine
2021-02-04 09:34:03 +08:00
你既然想给他初始值,那他就初始化时就是有类型的了,这为啥又要用泛型呢。
Jooooooooo
2021-02-04 10:16:11 +08:00
具体说说场景, 感觉不是用泛型的地方
abcbuzhiming
2021-02-04 16:00:21 +08:00
@yeqizhang
@EminemW
@Jooooooooo

因为这玩意如果不初始化,那么序列化为 json 后就是一个 null,因为某些前端限制,很难处理 null,它们希望这个东西至少序列化是个 {}
palmers
2021-02-04 16:44:54 +08:00
有初始值 不就有类型了吗?
sydra
2021-02-04 16:46:06 +08:00
@abcbuzhiming 在反序列化的接口里面增加一个空判断就可以了
Elroooo0Y
2021-02-04 22:15:34 +08:00
@abcbuzhiming
这很简单啊 重写 getResult 方法 返回一个空对象
LGA1150
2021-02-06 13:44:57 +08:00
典型的 XY 问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/751093

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX