Проблема заключается в том, что следующий код не может скомпилировать, если общая сигнатура состоит из нескольких ?
, которые являются тем же самым типом.Java Generic Advanced Usage
import java.util.Map;
import java.util.HashMap;
import java.util.function.Function;
public class Test {
private static <T> T findSelfReference(Map<T, T> map) {
for (Map.Entry<T, T> entry : map.entrySet()) {
if (entry.getKey() == entry.getValue()) {
return entry.getKey();
}
}
return null;
}
private static <T> T findSelfReference2(Map<T, T> map) {
for (T key : map.keySet()) {
if (map.get(key) == key) {
return key;
}
}
return null;
}
// Question: How to write the method signature that can ensure compile-time type safety? Both the signatures fail to compile.
// private static <T> String fun(Function<Map<T, T>, T> finder) {
private static String fun(Function<Map<?, ?>, ?> finder) {
Map<Integer, Integer> map1 = new HashMap<>();
// some processing to map1
Integer n = finder.apply(map1); // usage here, compile-time type checking wanted
Map<String, String> map2 = new HashMap<>();
// other processing to map2 depending on n
return finder.apply(finder, map2); // another usage
}
public static void main(String[] args) {
// Please don't change into helper class...
System.out.println(fun(Test::findSelfReference));
System.out.println(fun(Test::findSelfReference2));
}
}
В fun
, внутри каждого вызова finder.apply()
типа T
фиксируется. Но среди разных вызовов они используют разные типы. Я попробовал подстановочный знак (ref: here), но не повезло.
Я не хочу приводить результат в объект, в котором проверка должна выполняться во время выполнения. Вся проверка типов должна выполняться во время компиляции.
Возможно ли использование классов вспомогательных функций O (n), где n - число встроенных функций?