1.强转
在面向对象思想中有父类类型强转成子类类型的存在,当编程经历多时,这种程序是会经常遇到的,特别是在集合中。强转的之前肯定有父类引用指向子类对象,然后又想将父类类型强转成指向的子类类型。就是这样的一种转来转去的操作,会经常让人犯错误。
2.强转时会发生的错误
要想将父类类型强转成子类类型,那么这个类型必须是父类引用指向的那个对象类型或者是该对象类型的父类类型,才不会报错。而且强转发生的错误在编译时不会报错。
3.泛型的作用(泛型其实是上面思想的转变)
public class Test1 { public static void main(String[] agrs) { Student s=new Student(); Object o1=s; Student s1=new Student(); Object o11=s; Teacher t=new Teacher(); Object o2=t; Teacher t1=new Teacher(); Object o22=t; ID id=new ID(); Object o3=id; ID id1=new ID(); Object o31=id; //ID now=(ID)o3; //ID now2=(ID)o31; } }
比如上面的代码我们有6个对象,并且6个对象都已经上升为Object类型,但是我最后只想接收存在的ID类型的对象(只是想强转ID类型),那么我们所写的其他4个类型就根本不能存在,因为我们最后转型肯定是将所有的进行转型,但是我们需要保证我们‘转型的内容除了ID对象,没有别的,所以对于这个程序,我们需要删除掉所有的Student和Teacher的存在。所以泛型的作用就是如此,只要new了我们定义的泛型之外的东西,它就会报错,告诉我们这个我们不应该写,应该删除,因为跟自己预期的结果不一样,而且后面的转型泛型帮我们完成。它还能检验我们接受强转类型的那个类型是否是正确的,即是否是ID。总的来说就是帮你控制父类引用指向子类对象,还帮你控制父类强转成子类,并且我们不需要做强转的实际操作,因为我们get到的是泛型已经帮我们转好的子类对象。这个过程就像没有经过父类指向子类,父类强转子类,而是直接对子类对象的操作(new 子类,get到子类对象)
4.举例
public class Tool<Q> { public Q q; public Q getQ() { return q; } public void setQ(Q q) { this.q = q; } }
public class Student { public String name; public int age; public void add(Object o) { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class Test2 { public static void main(String[] agrs) { Tool<Student> t=new Tool<>(); t.setQ(new Student()); System.out.print(t.getQ()); } } //结果:com.sun.test.Student@15db9742
5.泛型类和泛型方法
泛型类是在类new的时候泛型就被赋值,泛型方法是在调用该方法的时候就被赋值。这个的区别,个人理解就是泛型的作用域的区别。泛型类的作用域是整个方法(除了泛型方法外),泛型方法的作用域就是该方法。
6.泛型接口
当该类实现接口时就实现该泛型