有许多原因促成了泛型的出现,其中最引人注目的就是创造容器类。
泛型的主要目的就是为了用来指定容器要持有什么类型的对象
一、简单泛型
public class Genericity {
public static void main(String[] args) {
// TODO 自动生成的方法存根
List list=new ArrayList();
list.add(new Cat());
list.add(new Dog());
}
}
class Cat{}
class Dog{}
在List集合中,可以持有不同类型的对象,但是编译器会报警告(ArrayList 是原始类型。应该将对通用类型 ArrayList<E> 的引用参数化),这里就提示我们需要给出一个具体的泛型,来约束容器的持有对象,提高安全性。
public class Genericity {
public static void main(String[] args) {
// TODO 自动生成的方法存根
List<Cat> list=new ArrayList<>();
list.add(new Cat());
list.add(new Dog());
}
}
class Cat{}
class Dog{}
在这个代码中,list.add(new Dog());这行就会报错,原因是加入了泛型,只能添加泛型的对象或其泛型的子类对象。
二、泛型方法
泛型方法跟加个Object修饰输入参数基本效果相同:
public class Genericity {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Cat cat=new Cat();
Dog dog=new Dog();
Genericity.run( cat); <pre name="code" class="java"> Genericity.run( dog);
}public static<T> void run(T A){System.out.println(A);}}class Cat{}
class Dog{}
只是推荐使用泛型这种方式。
三、泛型类
当我们不清楚要具体使用什么类时,与其用Object,我们更喜欢使用暂定不指定类型,在这里我们就需要使用到泛型类了
public class Genericity {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Person<Man> man=new Person<>(new Man());
man.getPerson();
}
}
class Man{
}
class Person<T>{
private T person;
public Person(T person){
this.person=person;
}
public T getPerson() {
return person;
}
public void setPerson(T person) {
this.person = person;
}
}
需要值得注意的是,在实例化泛型类时,必须给泛型确定类,不然将会报错。
四、在泛型接口中
泛型接口的使用跟泛型类基本没有什么区别,并且在工厂方法设计模式中也会用到。