使用Mybatis偶然间发现同事接口定义的泛型时A类型,但Mapper中resultType却写的B类型,Myabtis并未报错,就感到很奇怪,难不成Java可以动态改变类的运行时类型 ?
接口返回List 其中的Map为对于泛型
List<Map> selectList();
Mapper文件中返回为String
<!-- -->
<select id="selectList" resultType="java.lang.String">
select * from sys_menu
</select>
百度了一下后发现是泛型导致的, 如下 :
Java泛型是指在定义一个类时,某种参数或者返回值类型未知,采用一个类型占位符代表该未知类型的参数,且该泛型只是一个编译时期的检查 , 运行时期可改变该泛型的类型约束 !
泛型不指定时默认为Object
// ArratList的泛型不指定时 可以添加不同类的集合元素
List list1 = new ArrayList<>();
list1.add("aa");
list1.add(new HashMap<>());
泛型指定后也可以动态的修改(不同泛型的类之间的赋值):
// JAVA 泛型只是一个编译时期的检查约束
// 不主动申明泛型类型 运行时期可以在泛型内丢不同类型的值
List<String> list = new ArrayList<>();
// ArratList的泛型不指定时 可以添加不同类的集合元素
List list1 = new ArrayList<>();
list1.add("aa");
list1.add(new HashMap<>());
list = list1;
// list虽然申明了泛型为String 但是仍然可以通过对list重新赋值 从而导致原来list的String泛型约束失效
System.out.println(list.get(0).substring(1));
// 此处会产生一个ClassCastException
System.out.println(list.get(1).substring(1));