泛型问题的引出:
jdk 1.5 引出泛型
// package 泛型;
public class index {
public static void main (String[] args){
test t = new test();
t.setContent("aaa");
int a = (int) t.getContent();
System.out.println(a);
}
}
class test{
Object content;
public static void main (String[] args) throws Exception{
}
public void setContent(Object content) {
this.content = content;
}
public Object getContent() {
return content;
}
}
编译结果 | Ok |
执行结果 | Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap') |
可以看出该程序 获取类型 时 ,虽然 获取内容时 设置的变量类型有误,但是编译的时候却没有 报错。当执行的时候报错:强制向下转型错误 classCastException 。给程序的开发带来很大的安全性和不便。
使用泛型后:
// package 泛型;
public class index {
public static void main (String[] args){
test<String> t = new test<String>();
t.setContent("aaa");
int a = (int) t.getContent();
System.out.println(a);
}
}
class test<T>{
T content;
public static void main (String[] args) throws Exception{
}
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
编译结果 | 不兼容的类型: String无法转换为int int a = (int) t.getContent(); |
正确使用:
public class index {
public static void main (String[] args){
test<Integer> t = new test<Integer>();
t.setContent(999);
int a = t.getContent();
System.out.println(a);
}
}
需要了解的是:
1、泛型必须传 的是引用数据类型,如果传基本数据类型。这个过程会有 一个自动的 装箱(用包装类转引用数据数据类型)和 拆箱 (转基本数据类型) 处理 。
2、在 JDK1.7 之后
test<Integer> t = new test<Integer>();
可以简化为:
test<Integer> t = new test<>();
3、如果一个程序定义了泛型类,但是没有设置反省的类型,为了保证程序运行,会使用Object作为泛型的类型。
// package 泛型;
public class index {
public static void main (String[] args){
test t = new test ();
t.setContent("999");
int a = t.getContent();
System.out.println(a);
}
}
class test<T>{
T content;
public static void main (String[] args) throws Exception{
}
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
编译结果 | 错误: 不兼容的类型: Object无法转换为int int a = t.getContent(); ^ |