本节内容
1.泛型使用
2.泛型实战
一、泛型使用
1.泛型一般应用于Collection和Map
2.使用场景:在定义类或者接口的时候需要操作数据,但是又不清楚使用者需要哪种数据,也就是不知道参数的类型。
3.泛型作用:泛型可以用来定义类、接口、变量、方法
4.泛型的定义:在定义的时候可以使用泛型来代表任意类型,但是在使用的时候(定义变量,创建对象)必须传递实际类型,可以参考ArrayList的调用方法,那个<>是必须的,里面是啥可以自己定
class Test <E>{
}
//泛型接口
interface ITest<T>{
void test(T t);
}
public class MyClass {
public static void main(String[] args) {
Test<String> test;
new Test<String>();
Test<String> test1 =new Test<>();
}
}
5.类继承一个接口时,可以指定接口的类型
class MyClass1 implements ITest<String>{
@Override
public void test(String s) {
}
}
类继承一个接口时,也可以指定当前类型为泛型
class MyTest<T>implements ITest<T>{
@Override
public void test(T t) {
}
}
6.创建一个泛型类对象,可以直接创建,也可以使用匿名内部类
ITest<String> test2=new MyClass1();
//使用匿名内部类对象
ITest<String> test3 =new ITest<String>() {
@Override
public void test(String s) {
}
};
7.泛型方法,必须在方法前使用<T>来表示需要使用泛型
class Father{
public <T> void test(T t){
}
}
在使用的时候创建一个对象,调用时自己传入参数即可,任意参数,数组也可以
Father father =new Father();
father.test("jack");
ArrayList<String>names=new ArrayList<>();
names.add("jack");
names.add("merry");
father.test(names);
8.?通配符:当在使用一个泛型时,如果还不确定到底是什么类型,可以使用?来表示任何类型。注意:Java的集合类型不是自动变型
public void showList(List<?> list){
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
9.设置泛型的上限 extends,可以指定传过来的参数的上限
//指定传过来的类型的父类必须是food
class Student <T extends food>{
public void eat(T t){
}
}
以下为调用
Student<food> xw ;
Student<milk> xw1 ;
10.使用super来设置下限,可以是任意类型,但至少得是某个类型
//使用super来设置下限
class STest{
public <T> void copy(List src,List<? super T> dest){
}
}
二、泛型实战
1.以昨天写的联系人其中一个部分为例,在添加联系人时,我们希望直接排好序,我们可以用泛型来解决这个问题
2.在系统原有的基础上添加一个功能,将数据加入数组,就排好序。首先另外创建一个SortedList类,然后调用原本的add方法,将这个方法改写一下。
public class SortedList<T extends Comparable<? super T>> extends ArrayList<T> {
@Override
public boolean add(T t) {
//将数据保存
boolean result = super.add(t);
//对数组排序
Collections.sort(this);
//返回结果
return result;
}
}
想要调用add方法,首先就要继承ArrayList类,因为调用Collections.sort方法,就需要实现Compaeable接口,而且这个接口至少得是T类型。
在主函数里面使用这个方法
SortedList<Person> lists =new SortedList<>();
lists.add(new Person("jack"));
OK,以上就是今天的全部内容了,再见。
网友评论