跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Java 就完全没有办法给泛型属性一个初始化的值吗?
未分類
5 2 月 2021

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

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

資深大佬 : abcbuzhiming 1

一个类,含有一个泛型属性 T,我尝试了几乎所有的办法,都不能再这个类生成对象的时候就给这个 T 一个默认值。搜了一圈,英文网站上说这是无法做到的???
大佬有話說 (14)

  • 資深大佬 : sagaxu

    可以初始化为 null

  • 資深大佬 : codehz

    类型擦除了,所以拿不到类型信息,自然无法初始化,变通的方法就是加一个 Class<T> clazz 的参数(

  • 資深大佬 : chendy

    类型擦除,拿不到 T 的类型,无法设置

  • 資深大佬 : zpxshl

    可以的吧。用反射找到 t 真实类型,反射生成对应对象

  • 資深大佬 : yeqizhang

    想了解下为什么想要设置一个默认值?

  • 資深大佬 : zhzy0077

    这几乎是唯一一种做到的方法:

    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

    先说为什么要这么做

  • 資深大佬 : Takamine

    你既然想给他初始值,那他就初始化时就是有类型的了,这为啥又要用泛型呢。

  • 資深大佬 : Jooooooooo

    具体说说场景, 感觉不是用泛型的地方

  • 主 資深大佬 : abcbuzhiming

    @yeqizhang
    @EminemW
    @Jooooooooo

    因为这玩意如果不初始化,那么序列化为 json 后就是一个 null,因为某些前端限制,很难处理 null,它们希望这个东西至少序列化是个 {}

  • 資深大佬 : palmers

    有初始值 不就有类型了吗?

  • 資深大佬 : sydra

    @abcbuzhiming 在反序列化的接口里面增加一个空判断就可以了

  • 資深大佬 : Elroooo0Y

    @abcbuzhiming
    这很简单啊 重写 getResult 方法 返回一个空对象

  • 資深大佬 : LGA1150

    典型的 XY 问题

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具