You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@flink.apache.org by Miguel Coimbra <mi...@gmail.com> on 2018/08/16 20:28:11 UTC

InvalidTypesException: Type of TypeVariable 'K' in 'class X' could not be determined

Hello,

I have some code which compiles correctly (Flink 1.4) under Java 8.
It uses generic types.
While it compiles correctly, the execution fails with the error:

org.apache.flink.api.common.functions.InvalidTypesException: Type of
TypeVariable 'K' in 'class X' could not be determined.

This is my main:

public static void main(final String[] args) {
    X<Long> x = new X();
}


This is my class X:

public class X<K> {

    public X() {
        TypeInformation<K> keySelector = TypeInformation.of(new
TypeHint<K>(){});
    }
}


Perhaps I'm lacking knowledge on the way Java's generics work, but why
can't Flink determine the TypeVariable of 'K'?
As I am instantiating X parameterized as a Long, that information should
eventually reach Flink and the constructor of X would be equivalent to this:

public X() {
    TypeInformation<Long> keySelector = TypeInformation.of(new
TypeHint<Long>(){});
}

During execution, however, this error pops up.
What am I missing here, and what is the best way to achieve this generic
behavior in a Flink-idiomatic way?

Thank you very much for your time.

Re: InvalidTypesException: Type of TypeVariable 'K' in 'class X' could not be determined

Posted by Timo Walther <tw...@apache.org>.
Hi Miguel,

the issue that you are observing is due to Java's type erasure.

"new MyClass<String>()" is always erasured to "new MyClass()" by the 
Java compiler so it is impossible for Flink to extract something.

For classes in declarations like

class MyClass<String> extends ... {
    ...
}

the compiler adds the actual generic and Flink can extract it. So for 
classes the generics remain but generics passed to objects are erasured.

Regards,
Timo

Am 16.08.18 um 22:28 schrieb Miguel Coimbra:
> Hello,
>
> I have some code which compiles correctly (Flink 1.4) under Java 8.
> It uses generic types.
> While it compiles correctly, the execution fails with the error:
>
> org.apache.flink.api.common.functions.InvalidTypesException: Type of 
> TypeVariable 'K' in 'class X' could not be determined.
>
> This is my main:
>
> public static void main(final String[] args) {
>      X<Long> x = new X();
> }
>
> This is my class X:
>
> public class X<K>{
> public X() { TypeInformation<K> keySelector = TypeInformation.of(new 
> TypeHint<K>(){}); } }
>
> Perhaps I'm lacking knowledge on the way Java's generics work, but why 
> can't Flink determine the TypeVariable of 'K'?
> As I am instantiating X parameterized as a Long, that information 
> should eventually reach Flink and the constructor of X would be 
> equivalent to this:
>
> public X() { TypeInformation<Long> keySelector = 
> TypeInformation.of(new TypeHint<Long>(){}); }
> During execution, however, this error pops up.
> What am I missing here, and what is the best way to achieve this 
> generic behavior in a Flink-idiomatic way?
>
> Thank you very much for your time.