【发布时间】:2020-08-31 09:03:24
【问题描述】:
我很难理解关于 java 泛型的两个声明之间的区别。
假设我有以下两个接口
@FunctionalInterface
public interface CheckedFunction<T, R, E extends Throwable> {
R apply(T t) throws E;
}
public interface SomeInterface<DTO, E2 extends Throwable> {
<E extends Throwable> CheckedFunction<Object, String, E> firstFunction();
CheckedFunction<String, DTO, E2> secondFunction();
}
所以现在我创建了一个实现,并弹出了一个“未经检查”的警告,这是我想要理解的。
实现如下
public class TmpImpl implements SomeInterface<TmpObj, IOException> {
final ObjectMapper objectMapper = new ObjectMapper();
@Override
public CheckedFunction<Object, String, JsonProcessingException> firstFunction() {
return objectMapper::writeValueAsString;
}
@Override
public CheckedFunction<String, TmpObj, IOException> secondFunction() {
return json -> objectMapper.readValue(json, TmpObj.class);
}
public static class TmpObj {
String s;
}
}
对于这个例子,我使用com.fasterxml.jackson.databind.ObjectMapper,因为它完全符合我的要求并生成警告。
所以 firstFunction 现在有一个警告
Unchecked overriding: return type requires unchecked conversion. Found 'CheckedFunction<java.lang.Object,java.lang.String,com.fasterxml.jackson.core.JsonProcessingException>', required 'CheckedFunction<java.lang.Object,java.lang.String,E>
第二个就好了。
为什么会这样?为了修复它,我显然遗漏了一些我没有注意到的东西!
注意JsonProcessingException 扩展IOException(声明:public class JsonProcessingException extends IOException)
【问题讨论】:
-
你为什么在
firstFunction上参数化<E extends Throwable>? -
我想展示不同之处。如果我将泛型作为参数(E),它会抱怨未选中,但如果我在类(E2)上使用泛型,它不会
-
你为什么不试试
public interface SomeInterface<DTO, E extends Throwable, E2 extends Throwable> { CheckedFunction<Object, String, E> firstFunction(); CheckedFunction<String, DTO, E2> secondFunction(); }? -
那行得通。我试图了解为什么该参数不起作用。 @纳曼。只是没有用 2 个接口 + 2 个实现来制作相同的示例,而是将它们组合在一起
-
@MichaelMichailidis 因为您的接口需要方法级别的类型提示,以在推理期间识别正确的类型匹配。
标签: java generics exception lambda