美文网首页
java泛型-hibernate返回值引出的泛型问题

java泛型-hibernate返回值引出的泛型问题

作者: shaYanL | 来源:发表于2019-04-25 11:43 被阅读0次

hibernate返回的数据类型是List<Object>的,所以我不小心把其转换为List<Long>,结果并没有报错,但当我调用 List<Long>的get方法获取数据时报错:类型转换错误,下面来复现这个问题。

oracle中的类型是Number,在hibernate中对应的其实是BigDecimal,
hibernate对BigDecimal做了类型擦除,所以Java代码获取到的是List<Object>的结果。
运行以下代码模拟 hibernate返回数值类型,并进行类型转换

import java.util.ArrayList;
import java.util.List;
import java.math.BigDecimal; 
class Untitled {
    public static void main(String[] args) {
        System.out.println("A");
        List<BigDecimal> decimals = new ArrayList<>();
        decimals.add(new BigDecimal(100));
       decimals.add(new BigDecimal(101));
       List objs = decimals;
       List<Long> lll = (List<Long> )objs;
       System.out.println("B");
       Long aaa = (Long)lll.get(0);
        System.out.println("C");
    }
}

以下为上述代码执行结果:

A
B
Note: /usercode/file.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Exception in thread "main" java.lang.ClassCastException: class java.math.BigDecimal cannot be cast to class java.lang.Long (java.math.BigDecimal and java.lang.Long are in module java.base of loader 'bootstrap')
    at file.main(file.java:14)


好了,问题来了,为什么在执行 List<Long> lll = (List<Long> )objs;时,代码没报类型转换错误,反而在后面使用时Long aaa = (Long)lll.get(0);才报错呢?

结论:

因为类型擦除,所以 :
List<Long> lll = (List<Long> )objs;等价于 List lll = (List)objs;
因此这里看似用了类型转换,实际上什么都没有做。
而在执行 Long aaa = (Long)lll.get(0);时,lll.get(0)返回的Object类型对象实则是BigDecimal类型的实例,此时发现BigDecimal不能转换成Long,所以报错

相关文章

  • java泛型-hibernate返回值引出的泛型问题

    hibernate返回的数据类型是List 的,所以我不小心把其转换为List,结果并没有报错,但当我...

  • Java泛型

    java泛型解决容器,不确定类型问题,多个返回值,避免类型转换。 类泛型 类泛型定义的时候需要在类型后增加尖括号,...

  • Java泛型教程

    Java泛型教程导航 Java 泛型概述 Java泛型环境设置 Java泛型通用类 Java泛型类型参数命名约定 ...

  • Java高级特性-泛型:泛型的基本用法,怎样才能少写 1 万行代

    泛型是 Java 的一个高级特性。在 Mybatis、Hibernate 这种持久化框架,泛型更是无处不在。 然而...

  • 泛型

    泛型问题的引出 泛型从JDK1.5之后追加到Java语言里面的,其主要目的是为了解决ClassCastExcept...

  • 第二十八课:泛型

    泛型出现之前 泛型出现之后 Java深度历险(五)——Java泛型

  • Kotlin 泛型

    说起 kotlin 的泛型,就离不开 java 的泛型,首先来看下 java 的泛型,当然比较熟悉 java 泛型...

  • Java泛型

    参考:Java知识点总结(Java泛型) 自定义泛型类 自定义泛型接口 非泛型类中定义泛型方法 继承泛型类 通配符...

  • java泛型中类型擦除的一些思考

    java泛型 java泛型介绍 java泛型的参数只可以代表类,不能代表个别对象。由于java泛型的类型参数之实际...

  • Java泛型

    java泛型擦除,在.class文件中还是可以拿到泛型信息的 java中的类、成员变量和方法参数、返回值等都能从....

网友评论

      本文标题:java泛型-hibernate返回值引出的泛型问题

      本文链接:https://www.haomeiwen.com/subject/zfvagqtx.html