泛型使用注意事项
-
这一条的核心宗旨就是要用
List<>
,不要用List
-
List
和List<Object>
也是有区别的,List
逃避了泛型检查,而List<Object>
则明确地告诉编译器,它能够有任意类型的对象。 -
如果要使用泛型,但不确定或者不关心实际的类型参数,可以使用一个问号(无限制的通配符类型)代替。比如
Set<?>
。 -
使用原生态类型的场景:
-
传递class,比如
List.class
-
instanceof
,比如o instanceof Set
。这个时候强转也只能强转成Set<?>
if (o instanceof Set) { Set<?> s = (Set<?>) o; }
-
思考
-
使用反应一定要加上类型限制,而且限制的越具体越好(比如
extends
,super
)。 -
已有项目里有可能会出现比较多的原生态类型,主要原因猜测有几种:
- 写代码的时候还没有泛型,或者Java版本还没到
- 从网上直接抄的代码
- 使用了反射,json转换的时候需要转成
Map
,只能传Map.class
-
如果有json转泛型类的需求,可以使用
TypeReference
,它在不同的Json库中都有定义。它的基本原理就是用反射方法拿到了泛型。-
fastjson的
TypeReference
的构造方法:protected TypeReference() { Type superClass = this.getClass().getGenericSuperclass(); Type type = ((ParameterizedType)superClass).getActualTypeArguments()[0]; Type cachedType = (Type)classTypeCache.get(type); if (cachedType == null) { classTypeCache.putIfAbsent(type, type); cachedType = (Type)classTypeCache.get(type); } this.type = cachedType; }
-
TypeReference
的使用:首先定义好实体类:
public class Father { private String name; private List<Father> selves = new ArrayList<>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Father> getSelves() { return selves; } public void setSelves(List<Father> selves) { this.selves = selves; } @Override public String toString() { return "Father{" + "name='" + name + '\'' + ", selves=" + selves + '}'; } }
Json:
[ { "name": "name1", "selves": [ { "name": "name2" }, { "name": "name3", "selves": [ { "name": "name4" } ] } ] }]
使用
TypeReference
:List<Father> objects = JSON.parseObject("[\n" + " {\n" + " \"name\": \"name1\",\n" + " \"selves\": [\n" + " {\n" + " \"name\": \"name2\"\n" + " },\n" + " {\n" + " \"name\": \"name3\",\n" + " \"selves\": [\n" + " {\n" + " \"name\": \"name4\"\n" + " }\n" + " ]\n" + " }\n" + " ]\n" + " }]", new TypeReference<>() { }); System.out.println(objects);
运行结果:
image.png
-
-
对于
instanceof
的情况,没有想到有可能会instanceof
泛型类的情况,按道理来说也是可以通过object.getClass().getGenericSuperclass()
拿到具体的泛型类的 -
泛型还有一个比较有意思的地方,不知道原因。下面两个代码,第一个为什么没有报错?
-
image.png
-
image.png
-
网友评论