Skip to content
Advertisement

Java Generic Types in Method signature which are not used

What is the use of specifying Generic types in the method signature when they are not getting used in the method, for instance consider the below method from Kafka Materialized:

public static <K, V, S extends StateStore> Materialized<K, V, S> as(String storeName) {
    Named.validate(storeName);
    return new Materialized(storeName);
}

private Materialized(String storeName) {
    this.storeName = storeName;
}

Here the types K,V,S are not used in the method.

Github link for materialized class

Advertisement

Answer

What is the use of specifying Generic types in the method signature when they are not getting used in the method

You actually are (or should be) using them in the method:

return new Materialized(storeName);

This is a raw type. It’s a transcription error from the source code you linked:

return new Materialized<>(storeName);

is a shorthand for:

return new Materialized<K, V, S>(storeName);

But anyway, type variables on the method which are only used in the return type are used after you’ve called the method.

For example, creating an ArrayList<T> in a method allows you to add instances of T to the result.

<T> List<T> myMethod() {
  return new ArrayList<>();
} 

// At the call site:
List<String> list = myMethod();
list.add("Hello");

In the case of Materialized, this gives type information about the fields which are declared in terms of these type variables: Serde<K> keySerde, Serde<V> valueSerde and StoreSupplier<S> storeSupplier; Kafka can then access fields/methods on these fields which do things with specific types.

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement