==
==
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TestJackson {
public static ObjectMapper mapper = new ObjectMapper();
public static ObjectMapper mapper1 = new ObjectMapper();
public static void main(String[] args) throws Exception {
List listPerson = new ArrayList<>();
listPerson.add(new Person("张三1"));
listPerson.add(new Person("张三2"));
String jsonPerson = mapper.writeValueAsString(listPerson);
// [{"name":"张三1"},{"name":"张三2"}]
System.out.println(jsonPerson);
// 现在我要用jsonPerson还原
List getlistPerson = mapper1.readValue(jsonPerson,
new TypeReference>() {
});
System.out.println(getlistPerson.get(0).name);
}
}
class Person {
public Person(){
}
public String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这是一个Jackson json的例子。
==
首先说泛型类。比如说我们平时使用的HashMap,类的定义是 public class HashMap
如果要使用HashMap就需要指定泛型的实际类型。比如说 new HashMap
① 对于类的定义,也就是HashMap的制作角度讲,使用了K V字符后,便可以使用KV这两个字符,但是只能存在声明和引用的使用,而不能实例化。
② 对于类的使用来说,比如 HashMap
如果是其他类,子类也是可以的。比如 List
如果是泛型方法的定义,
比如:
public
return null;
}
这里的T已经和类无关了,这里的T对应的是 Person p=new ClassName().add(new Person()) 这里public后面
泛型擦除讲的是什么:
山面的①和②中①是定义 ②是声明,泛型擦除讲的是擦除② 而不是①。
比如说 List
但是 如果是class
==
public class R {
public static void main(String[] args) {
TClass t = new TClass() {};
//TClass
System.out.println(t.getClass().getGenericSuperclass());
}
}
class TClass {
}
这里获取到了//TClass
这个代码其实是
public class R {
public static void main(String[] args) {
TClass t = new InnerTClass();
System.out.println(t.getClass().getGenericSuperclass());
}
}
class TClass {
}
class InnerTClass extends TClass{
}
==
这里的两个代码等价了。根据superclass获取到了type的类型。Jackson就是以这个type为框架实现的类实例化。在InnerClass中泛型已经是被使用者而不是定义者了。
这里的String的意思是 java.lang.String
如果代码是
class TClass
}
class InnerTClass
}
这样的形式的话,那么对于这里的两个String 都是定义 ,不是使用,也就是说这里的两个String都和T是一个意思,而不是java.lang.Sting那个String。 两个没有一点关系。