[
https://issues.apache.org/jira/browse/FLINK-14380?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16957626#comment-16957626
]
Aljoscha Krettek commented on FLINK-14380:
------------------------------------------
I see, the problem is here:
https://github.com/apache/flink/blob/e0efabe8884f22b4a1c7ab9df3274b3fca03dcfb/flink-streaming-scala/src/main/scala/org/apache/flink/streaming/api/scala/DataStream.scala#L647.
The issue is that we call {{DataStream.flatMap()}} from the Java API, and this
in turns calls the type extractor. But afterwards we set the type that was
extracted from Scala using {{returns()}}. {{process()}} has a version that
allows passing the {{TypeInformation}} in the method call, the solution for
this issue here will be to also do the same for the other methods of
{{DataStream}} and not use {{returns()}}.
Anyone want to take a try and cut a PR for that?
> Type Extractor POJO setter check does not allow for Immutable Case Class
> ------------------------------------------------------------------------
>
> Key: FLINK-14380
> URL: https://issues.apache.org/jira/browse/FLINK-14380
> Project: Flink
> Issue Type: Bug
> Components: API / Scala
> Affects Versions: 1.8.2, 1.9.0
> Environment: Not relavent
>
> Reporter: Elliot Pourmand
> Priority: Major
>
> When deciding if a class conforms to POJO using the type extractor Flink
> checks that the class implements a setter and getter method. For the setter
> method Flink makes the assertion that the return type is `Void`. This is an
> issue if using a case class as often the return type of a case class setter
> is a copy of the objects class. Consider the following case class:
> {code:scala}
> case class SomeClass(x: Int) {
> x_=(newX: Int): SomeClass = { this.copy(x = newX) }
> }
> {code}
> This class will be identified as not being valid POJO although getter
> (generated) and setter methods are provided because the return type of the
> setter is not void.
> This issue discourages immutabilaty and makes the usage of case classes not
> possible without falling back to Kryo Serializer.
> The issue is located in
> https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java
> on line 1806. Here is a permalink to the line
> https://github.com/apache/flink/blob/80b27a150026b7b5cb707bd9fa3e17f565bb8112/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java#L1806
> A copy of the if check is here
> {code:java}
> if((methodNameLow.equals("set"+fieldNameLow) ||
> methodNameLow.equals(fieldNameLow+"_$eq")) &&
> m.getParameterTypes().length == 1 && //
> one parameter of the field's type
>
> (m.getGenericParameterTypes()[0].equals( fieldType ) || (fieldTypeWrapper !=
> null && m.getParameterTypes()[0].equals( fieldTypeWrapper )) ||
> (fieldTypeGeneric != null &&
> m.getGenericParameterTypes()[0].equals(fieldTypeGeneric) ) )&&
> // return type is void.
> m.getReturnType().equals(Void.TYPE)
> ) {
> hasSetter = true;
> }
> }
> {code}
> I believe the
> {code:java}
> m.getReturnType().equals(Void.TYPE)
> {code}
> should be modified to
> {code:java}
> m.getReturnType().equals(Void.TYPE) || m.getReturnType().equals(clazz)
> {code}
> This will allow for case class setters which return copies of the object
> enabling to use case classes. This allows us to maintain immutability without
> being forced to fall back to the Kryo Serializer.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)