最近在学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<