#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 не используются в методе.
Комментарии:
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
; Кафка может затем получить доступ к полям/методам в этих полях, которые выполняют действия с определенными типами.