我无法理解以下代码段:
Unirest.setObjectMapper(new ObjectMapper() {
private com.fasterxml.jackson.databind.ObjectMapper jacksonObjectMapper
= new com.fasterxml.jackson.databind.ObjectMapper();
public <T> T readValue(String value, Class<T> valueType) {
try {
return jacksonObjectMapper.readValue(value, valueType);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public String writeValue(Object value) {
try {
return jacksonObjectMapper.writeValueAsString(value);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
});
ObjectMapper是一个接口,为什么我可以用new关键字来定义?它看起来像java 8功能,对吧?
答案 0 :(得分:2)
这是Java中非常常见的做法,您所看到的称为匿名类。相同的代码可以替换为:
private class ObjectMapperChild extends ObjectMapper
{
private com.fasterxml.jackson.databind.ObjectMapper jacksonObjectMapper
= new com.fasterxml.jackson.databind.ObjectMapper();
public <T> T readValue(String value, Class<T> valueType) {
try {
return jacksonObjectMapper.readValue(value, valueType);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public String writeValue(Object value) {
try {
return jacksonObjectMapper.writeValueAsString(value);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
ObjectmapperChild objMapperChild = new ObjectMapperChild();
Unirest.setObjectMapper(objMapperChild);
答案 1 :(得分:1)
这是一个匿名课程。例如,如果您不想创建带有声明的新类文件,因为您只在代码的那个位置使用此类,那么您可以这样做。
在Java 1.8中引入了Functional接口(只有一个方法的接口),您可以使用Lambda表达式声明这样的匿名类。例如,当您要过滤列表时:
(Person p) -> p.getGender() == Person.Sex.MALE
与
相同 new CheckPerson() {
public boolean test(Person p) {
return p.getGender() == Person.Sex.MALE;
}
}
当
interface CheckPerson {
boolean test(Person p);
}
您可以在此处找到有关lambdas的更多信息 - https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html。