Общие типы Java в сигнатуре метода, которые не используются

#java #generics #apache-kafka-streams

Вопрос:

Какой смысл указывать универсальные типы в сигнатуре метода, когда они не используются в методе, например, рассмотрим приведенный ниже метод из Кафки, материализованный:

 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;
}
 

Здесь типы K,V,S не используются в методе.

Ссылка на Github для материализованного класса

Комментарии:

1. Не используйте необработанные типы: return new Materialized<>(storeName); .

2. K=тип ключа, V=тип значения. Результат as then вводится, поэтому будет проверен другой метод, например получение ключа. Конструктор Materialized также объявит поля, одним из которых может быть K key; .

Ответ №1:

Какой смысл указывать универсальные типы в сигнатуре метода, если они не используются в методе

Вы на самом деле используете (или должны использовать) их в методе:

 return new Materialized(storeName);
 

Это необработанный тип. Это ошибка транскрипции из исходного кода, который вы связали:

 return new Materialized<>(storeName);
 

является сокращением для:

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

Но в любом случае, переменные типа в методе, которые используются только в возвращаемом типе, используются после того, как вы вызвали метод.

Например, создание ArrayList<T> в методе позволяет добавлять экземпляры T в результат.

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

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

В случае Materialized , это дает информацию о типе полей , которые объявлены в терминах этих переменных типа: Serde<K> keySerde , Serde<V> valueSerde и StoreSupplier<S> storeSupplier ; Кафка может затем получить доступ к полям/методам в этих полях, которые выполняют действия с определенными типами.