У меня есть (насколько я понимаю) монада, созданная для определенного домена c, которая действует как комбинация Either / Try и действия для вызова конечной точки отдыха. Это класс с параметром generi c одного типа для содержащегося в нем значения. Поскольку некоторые функции написаны только для побочного эффекта и не заботятся о возвращаемом значении, я обычно аннотировал их возврат просто как MyMonadThing<?>
. Однако такой шаблон вызывает у меня проблемы при попытке разветвить logi c в некоторых местах. Я не буду показывать класс монады, но вот пример использования списков, который иллюстрирует проблему
public static void main(String[] args) {
map(Arrays.asList(1, 2, 3), t -> {
return t == 2? foo() : bar();
});
}
static <T, NewT> List<NewT> map(List<T> lst, Function<T, List<NewT>> fn) {
return lst.stream().flatMap(t -> fn.apply(t).stream()).collect(Collectors.toList());
}
static List<?> foo() {
return Arrays.asList("foo");
}
static List<?> bar() {
return Arrays.asList("bar");
}
Это не будет компилироваться из-за троичности.
- Type mismatch: cannot convert from List<capture#2-of ?> to
List<Object>
Я могу исправить это, применив (ie return (List<?>) (t == 2? foo() : bar());
), но это просто странно. Предположим, что java разрешает это запускать, и результат в main будет просто типа List<?>
- при каких обстоятельствах это может привести к фактической ошибке из-за ненадежной системы типов?