聊聊Java类型擦除、Flink中使用Lambda表达式丢失信息和Flink类型暗示机制

本文探讨了Java类型擦除如何影响Flink中的Lambda表达式,导致泛型类型信息丢失。通过示例解释了Java泛型擦除的原因和两种方式,并指出Flink为解决此问题引入的类型暗示(type hint)机制。使用类型暗示,开发者可以指定Lambda表达式的返回类型,确保程序正确执行。
摘要由CSDN通过智能技术生成

最近在学Flink时发现,由于Java类型擦除的存在,导致Flink中使用Lambda表达式时,无法检测出泛型的类型,需要使用Flink类型暗示(type hint)机制才能解决。现在我们就深入剖析一下吧!

什么是Java泛型擦除

本文不介绍Java的泛型,对泛型不太了解的同学强烈推荐这篇博客:https://www.cnblogs.com/coprince/p/8603492.html

看两个例子:

(1)例1

List arrayList = new ArrayList();
arrayList.add("abc");
arrayList.add(12);

for(int i = 0; i< arrayList.size();i++){
   
	String item = (String)arrayList.get(i);
	System.out.println(item);
}

运行报错:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

因为我们没有指定泛型的类型,所以在List中可以存放任意类型的数据。上述代码先在List中添加了一个String类型的数据,后添加了一个Integer类型的数据,编译器不会提示任何错误,但运行时却报错了。

这是因为List以第一次添加的数据类型为准,即以String的方式使用,后面再添加Integer类型的数据,程序就崩溃了。为了在编译阶段解决类似的问题,我们可以在代码中执行泛型的类型:

List<String> arrayList = new ArrayList<String>();
//arrayList.add(100); 在编译阶段,编译器提示错误

(2)例2

List<String> stringArrayList = new ArrayList<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷恩Layne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值