我在学习集合的时候对泛型还不太了解,只是觉得用了泛型之后能向自己的集合里加入自己指定类型的对象,可以减少数据类型的转换。那么,脱离集合后,泛型到底该如何使用。今天碰巧看了一段关于泛型的讲解,觉得泛型也没有自己想象中那么难,于是将自己的心得分享出来,希望能帮到有需要的人。
泛型的知识点大概有:泛型类,限制泛型,泛型方法,泛型接口。
泛型类
下面泛型类的例子就非常简单明了了,泛型类一般只需在类名后加<T>符号(T表示一种数据类型,像Integer,String),里面的字母是可以随便取的,如A,B,C
public class CC<T> {
public T ob;
public CC(T a) {
this.ob = a;
}
public T getOb() {
return ob;
}
public void setOb(T ob) {
this.ob = ob;
}
}
public class Textcc {
public static void main(String[] args) {
CC<Integer> i = new CC<Integer>(5);
System.out.println(i.getOb());//5
CC<String> s = new CC<String>("泛型好简单啊");
System.out.println(s.getOb());//泛型好简单啊
}
}
限制泛型
其实限制泛型也非常的简单,就在类名后加<T extends ?(这个问号代表一个父类)>,像下面例子里的Demo<T extends Animal>,表示的是往Demo装的对象必须是Animal类型或者继承Animal的子类类型,如Demo<Animal> animal = new Demo<Animal>(new Animal()); 放其它类型的对象则会编译出错。
package fanxing;
public class Animal {
public void print() {
System.out.println("我是动物");
}
}
package fanxing;
public class Cat extends Animal {
public void print() {
System.out.println("I am a cat");
}
}
package fanxing;
public class Dog extends Animal {
public void print() {
System.out.println("I am a dog");
}
}
package fanxing;
public class Demo<T extends Animal> {
public T t;
public Demo(T t) {
super();
this.t = t;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public void print() {
System.out.println("T的类型是:"+t.getClass().getName());
}
}
package fanxing;
public class T_testDemo {
public static void main(String[] args) {
Demo<Animal> animal = new Demo<Animal>(new Animal());
Animal a = animal.getT();
a.print();//我是动物
Demo<Dog> dog = new Demo<Dog>(new Dog());
Dog d = dog.getT();
d.print();//I am a dog
Demo<Cat> cat = new Demo<Cat>(new Cat());
Cat c = cat.getT();
c.print();//I am a cat
}
}
泛型通配符
package fanxing;
public class TestTPF {
public static void take(Demo<?> d) {
d.print();
}
public static void main(String[] args) {
Demo<Dog> dog = new Demo<Dog>(new Dog());
take(dog);
Demo<Cat> cat = new Demo<Cat>(new Cat());
take(cat);
}
}
泛型方法
可以通过泛型输出这样的数组
或者可以指定只有某种对象才能使用这种方法,这里表示只有Dog类及其子类对象才能使用f方法,其他对象则编译出错。
package fanxing;
public class Fxway {
public static<E> void print(E[] t) {
for(E t1:t) {
System.out.println(t1);
}
}
public static<T extends Dog> void f(T t) {
System.out.println("T的类型:"+t.getClass().getName());
}
public static void main(String[] args) {
Integer[] a = {1, 2, 3, 4};
print(a);
Dog rr = new Dog();
f(rr);
Cat r2 = new Cat();
// f(r2);
}
}