abcbuzhiming
V2EX  ›  Java

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

  •  
  •   abcbuzhiming · Feb 3, 2021 · 4743 views
    This topic created in 2104 days ago, the information mentioned may be changed or developed.
    一个类,含有一个泛型属性 T,我尝试了几乎所有的办法,都不能再这个类生成对象的时候就给这个 T 一个默认值。搜了一圈,英文网站上说这是无法做到的???
    14 replies  •  2021-02-06 13:44:57 +08:00
    sagaxu
    sagaxu
    Feb 3, 2021 via Android
    1
    可以初始化为 null
    codehz
    codehz
    Feb 4, 2021
    2
    类型擦除了,所以拿不到类型信息,自然无法初始化,变通的方法就是加一个 Class<T> clazz 的参数(
    chendy
    chendy
    Feb 4, 2021
    3
    类型擦除,拿不到 T 的类型,无法设置
    zpxshl
    zpxshl
    Feb 4, 2021 via Android
    4
    可以的吧。用反射找到 t 真实类型,反射生成对应对象
    yungo8
    yungo8
    Feb 4, 2021 via Android
    5
    想了解下为什么想要设置一个默认值?
    zhzy0077
    zhzy0077
    Feb 4, 2021
    6
    这几乎是唯一一种做到的方法:

    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
    EminemW
    Feb 4, 2021 via iPhone
    7
    先说为什么要这么做
    Takamine
    Takamine
    Feb 4, 2021 via Android
    8
    你既然想给他初始值,那他就初始化时就是有类型的了,这为啥又要用泛型呢。
    Jooooooooo
    Jooooooooo
    Feb 4, 2021
    9
    具体说说场景, 感觉不是用泛型的地方
    abcbuzhiming
    abcbuzhiming
    OP
    Feb 4, 2021
    10
    @yeqizhang
    @EminemW
    @Jooooooooo

    因为这玩意如果不初始化,那么序列化为 json 后就是一个 null,因为某些前端限制,很难处理 null,它们希望这个东西至少序列化是个 {}
    palmers
    palmers
    Feb 4, 2021
    11
    有初始值 不就有类型了吗?
    sydra
    sydra
    Feb 4, 2021
    12
    @abcbuzhiming 在反序列化的接口里面增加一个空判断就可以了
    Elroooo0Y
    Elroooo0Y
    Feb 4, 2021
    13
    @abcbuzhiming
    这很简单啊 重写 getResult 方法 返回一个空对象
    LGA1150
    LGA1150
    Feb 6, 2021 via Android
    14
    典型的 XY 问题
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   669 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 18:15 · PVG 02:15 · LAX 10:15 · JFK 13:15
    ♥ Do have faith in what you're doing.