Java中泛型的理解
所谓泛型,是指使程序员定义安全的类型,能够避免强制转换类型时出现的错误不被编译器识别,而运行时却报错。
以下是个人的理解:
在编写Python类或者函数的时候(主要是函数),无需告诉程序返回数据的类型,直接return就行。有很多语言也都是无需声明返回数据的类型的,如PHP,PHP常用于编写接口,然后Java来调用。如果这个接口没有告诉Java接口返回数据的类型的话,Java在编写代码的时候,是不会报错的。举个例子,但如果Java需要的是整型数据,接口却返回了一个浮点型数据,那程序运行就会报错。
这里就体现了泛型的重要性。
泛型的定义
直接上我自己学习写的泛型定义代码
public class Test<T, S> {
T over;
S str;
public T getOver() {
return over;
}
public void setOver(T over) {
this.over = over;
}
public void setStr(S str) {
this.str = str;
}
public S getStr() {
return str;
}
public static void main(String[] args) {
Test<Boolean, String> b = new Test();
b.setOver(true);
boolean b0 = b.getOver();
System.out.println(b0);
Test<Boolean, String> s = new Test();
s.setStr("huangg");
String str = s.getStr();
System.out.println(str);
// int i = b.getOver();
// Father<Integer, String> f = new Child(1, "2");
// Child<Integer, String, Boolean> c = new Child(1, false);
}
}
现在来记录学习体会:
-
public class Test<T, S> { T over; S str;
先看这几行代码,在定义类名Test时, 写了<T, S>这个泛型的表达方式,告诉编译器定义的是一个泛型类
接着,定义了两个泛型的成员变量over和str。如果不好理解的话,可以将这两行代码理解为:
int over; String str;
效果和上面差不多,只是上面的变量不知道是啥类型的。
-
public T getOver() { return over; } public void setOver(T over) { this.over = over; } public void setStr(S str) { this.str = str; } public S getStr() { return str; }
这是在定义set和get方法,注意get方法的时候,要写返回值的类型,分别是T和S,与泛型一致就行了。
-
public static void main(String[] args) { Test<Boolean, String> b = new Test(); b.setOver(true); boolean b0 = b.getOver(); System.out.println(b0); Test<Boolean, String> s = new Test(); s.setStr("huangg"); String str = s.getStr(); System.out.println(str); // int i = b.getOver(); // Father<Integer, String> f = new Child(1, "2"); // Child<Integer, String, Boolean> c = new Child(1, false); }
这是主方法,
Test<Boolean, String> b = new Test();
主方法首先实例化对象,看这里,在实例化对象的时候,就要定义泛型类型了,第一个是布尔值,第二个是字符串,然后将作为布尔值的over值用set方法设置为true,get方法可以取值,下面的第二个变量用同样的方式取值和设置值。
这就是泛型类的定义方法,和常规类差别不大,但是要注意的是,泛型的名字最好不要和已有的类型重名,这样容易出错。泛型可以有一个,也可以有多个。
泛型的其他用法
除了上述使用方法外,还可以
-
限制泛型的可用类型,如下:
public class Text <T extends List>{}
这里的泛型就限定只能是List类型的子类
-
使用类型通配符?,如
public class Text <? extends List>{}
-
继承泛型类和实现泛型接口。