最近,当我重新访问Flink的相关知识点时,我们发现了一个我以前没有注意的观点。当我们使用Flink的lambda表达式时,必须给出返回值类型,如果未给出的话,它将报告错误。如下:
找到信息并发现此问题是由lambda表达引起的刮水器引起的。
通用类型在Java中具有非常重要的位置,并且在面向对象的编程和各种设计模型中具有广泛的应用程序。什么是通用的?为什么使用通用类型?找到类型,即“参数化类型”。它涉及参数,最熟悉的是定义方法时的形式参数,然后在调用此方法时传递实体参数。原始特定类型,类似于该方法中的变量参数。目前,该类型还定义为参数形式(可以称为类型的类型),然后在使用/calls.type(类型固体人参)时引入特定的类型。通用类型的本质是参数化类型(如果不创建新类型的情况,请通过指定的不同类型控制指定的特定限制类型)。。该参数类型可以在类,接口和方法中使用,分别称为通用,通用接口和通用方法。
通用用途的使用是使用<>,存在<>添加类型。例如
让我们考虑一下,如果没有通用工具,在编写代码的过程中可能会遇到什么问题?以非常普遍的示例。
错误的内容如下:
因为我们没有指定通用类型的类型,所以我们可以将任何类型的数据存储在列表中。上面的代码首先将字符串类型数据添加到列表中,然后添加整数类型数据。编译器不会引起任何错误,但是在运行时报告了该错误。这是因为列表基于第一个添加的数据类型,该数据类型用于字符串中,并且稍后添加整数类型的数据,并且程序崩溃了为了在编译阶段解决类似问题,我们可以在代码中执行通用类型的类型:
我们继续观看第二个示例:
通过上面的示例,可以证明该程序将在编译后采取通用措施。换句话说,Java中的通用类型仅在编译阶段有效。在正确测试通用结果后,在汇编过程中进行了通用,该过程是通用的。在运行时将消除信息。编译器将仅在对象边界处添加类型检查和转换方法到JVM并离开JVM。信息将不会进入运行时阶段,即SO称为SO的Java类型消除。
有两种方法可以刮擦通用刮板。Java使用第一种方式,C ++和C#使用第二种方法
方法1:代码共享。对于相同的原始类型下的遗传类型,仅生成相同的目标代码。
方法两个:代码专业化。为每种通用类型生成不同的目标代码。
它们也通常被称为“假”通用物和“ true”通用物。结果,该程序不会在运行时感知通用类型的类型,因此仅剩下上述示例1的代码。实际上,这是阶级。 extends ArrayList>比较,导致真实的输出。为什么Java使用代码共享机制进行类型擦除?有两个原因:首先,Java通用类型是仅出现在1.5版之前的特征。在此之前,JVM在没有通用条件下经历了很长的发展。如果使用代码专业化,系统会改变骨损伤和骨骼,无法保证向前的兼容性。第二个是代码专业化为每种通用类型生成不同的目标代码。如果有10个不同的通用列表,则会生成10个字节代码,从而导致代码膨胀。
Java的通用类型被许多人批评为“伪代”,这也是由于根除的类型。通用类型属于Java中的语法糖;Java中的JVM虚拟机级别没有通用概念。javain汇编阶段,删除了通用参数,并且在操作阶段没有通用概念。
作为上述类,将类型参数t删除后,将Java编译为类文件后被编译到类文件中。字段OBJ已成为对象类型。两个GET和SET方法中的T也被对象类型替换。
lambda表达式通常在Flink中用于简化我们的代码。我们查看以下代码:
以上是一个非常简单的WordCount代码示例。如果直接执行,将会出现错误,也就是说,我们在开始时指出的问题。
这意味着缺少tuple2中的参数类型,这可能是因为lambda表达式无法提供足够的信息,因此无法自动检测tuple2中的参数类型。。
上面提到的类型参数将在Java中执行,但是当使用匿名内部类实现FlatMapfunction时,为什么您仍然可以获取通用参数?遗传相关信息。JAVAC编译期间结构之外的信息(程序执行流)信息已存储在单词中。在代码的代码属性中,该方法的遗传参数数据将是保留。这些存储在签名属性中;
lambda表达式实现了flatmapfunction但无法获得通用参数,是的。.sindruction执行logic.lambda表达式丢失了更多类型的信息,这也导致使用lambda表达式获得通用参数;
因此,如何解决使用lambda表达式引起的通用刮擦问题?实际上,上述异常信息已经很清楚。调用返回方法或实现ResultTyperyable接口。在这里,您只说这两种用法;
调用此方法的方法的用法相对简单,即,返回类型参数是您需要调用返回方法进行注册的返回者的返回,并且返回方法必须是某个操作员之后的第一个调用。它是没有某个操作员的注册返回类型;
为了实现此界面,您可以告诉系统的系统系统的系统,该系统实现了该接口的最高优先级,并且将不再通过反射获得返回值类型。您还可以根据该界面使用不同的返回值类型不同的类型参数;可以自定义此接口的实现。该模式在Flink Kafka相关的连接器中使用。
此外,对于确定的数据类型(即没有通用数据类型),可以在Flink中使用lambda表达式。例如:
以上代码是正常实施的。
原始:https://juejin.cn/post/7096737483048058911