泛型:
一:基础用法:
1.作用:当做一些集合操作的时候,需要保证集合的类型是统一的此时需要泛型进行限制;
2.优点: 1)数据安全; 2)获取数据时效率比较高;
3.用法:使用在定义对象的时候,通过<>中设置合理的类型来进行实现;
代码实现:
public class GenericDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("abc");
list.add("true");
list.add(new Person("张三",12).toString());
for (String iter:list) {
System.out.println(iter);
}
}
}
二:高阶用法:
1.泛型类:
用法: 在定义类时,在类名后面加上<E、K、V>,起到占位的作用,类中的方法的返回值类型属性都可以使用;
代码实现:
package com.cy;
/**
* 类泛型
*/
public class GenericClass<T>{
private Integer id;
private T t;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public void show(){
System.out.println("id:"+id+",T"+t);
}
@Override
public String toString() {
return "GenericClass{" +
"id=" + id +
", t=" + t +
'}';
}
}
public class GenericDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("abc");
list.add("true");
list.add(new Person("张三",12).toString());
for (String iter:list) {
System.out.println(iter);
}
//类泛型
GenericClass<Person> genericClass = new GenericClass<>();
genericClass.setId(1);
genericClass.setT(new Person("张三",15));
genericClass.show();
}
}
2.泛型接口:
1)用法:在定义接口的时候,在接口名称后面添加<E、K、V、A、B>, 子类在进行实现时,可以不填写泛型的类型,但子接口需要去填写对象的泛型;
2)代码实现:
package com.cy;
/**
* 泛型接口
* @param <T>
*/
public interface ICommonService <T>{
/**
* 保存方法
* @param t
* @return
*/
Integer save(T t);
/**
* 删除方法
* @param id
* @return
*/
Integer delete(Integer id);
/**
* 修改方法
* @param id
* @return
*/
Integer update(Integer id);
/**
* 查询方法
* @param id
* @return
*/
T select(Integer id);
}
package com.cy;
import com.entity.Person;
public interface UserService extends ICommonService<Person>{
}
package com.cy;
import com.entity.Person;
public class UserServiceImpl implements UserService{
@Override
public Integer save(Person person) {
System.out.println("sava方法执行了");
return 1;
}
@Override
public Integer delete(Integer id) {
System.out.println("删除方法执行了");
return id;
}
@Override
public Integer update(Integer id) {
System.out.println("修改方法执行了");
return id;
}
@Override
public Person select(Integer id) {
Person person = new Person("李四", id);
return person;
}
}
package com.cy;
import com.entity.Person;
import java.util.ArrayList;
/**
* 泛型:
*
* 优点:
* 1.数据安全;
* 2.获取数据时效率比较高;、
* 给集合中的元素设置相同的类型就是泛型的基本需求;
* 使用在定义对象的时候,通过<>中设置合理的类型来进行实现;
* 高阶应用:
* 1.泛型类:
* 在定义类时在类后面添加<E、K、V>,起到占位的作用,类中的方法的返回值和属性的类型都可以使用;
* 2.泛型接口:
* 3.泛型方法:
* 4.泛型的上限:
* 5.泛型的下限:
*/
public class GenericDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("abc");
list.add("true");
list.add(new Person("张三",12).toString());
for (String iter:list) {
System.out.println(iter);
}
//类泛型
GenericClass<Person> genericClass = new GenericClass<>();
genericClass.setId(1);
genericClass.setT(new Person("张三",15));
genericClass.show();
//接口泛型
UserService service=new UserServiceImpl();
System.out.println(service.save(new Person("周五",18)));
System.out.println(service.delete(2));
System.out.println(service.update(3));
System.out.println(service.select(16));
}
}
3.泛型方法
1)用法:在定义方法时,指定方法的返回值和参数是自定义的占位符,可以是类名中的T,也可以是自定义的Q,只不过需要使用<Q>定义在返回值前面;
2)代码实现:
public class GenericDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("abc");
list.add("true");
list.add(new Person("张三",12).toString());
for (String iter:list) {
System.out.println(iter);
}
//类泛型
GenericClass<Person> genericClass = new GenericClass<>();
genericClass.setId(1);
genericClass.setT(new Person("张三",15));
genericClass.show();
//接口泛型
UserService service=new UserServiceImpl();
System.out.println(service.save(new Person("周五",18)));
System.out.println(service.delete(2));
System.out.println(service.update(3));
System.out.println(service.select(16));
//泛型方法
GenericMethod<Person> genericMethod = new GenericMethod<>();
genericMethod.setT(new Person("小王",19));
genericMethod.show("最帅");
}
}
package com.cy;
/**
* 泛型方法
*/
public class GenericMethod<T> {
private T t;
public GenericMethod() {
}
public GenericMethod(T t) {
this.t = t;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public <Q> void show(Q q){
System.out.println(q);
System.out.println(t);
}
}
4.泛型上限(工作中不用,读源码API时会用):
用法:如果父类确定了,所有的子类都可以直接使用;
案例:
5.泛型下限(工作中不用,读源码API时会用);
用法:如果子类确定了,子类的所有父类都可以传递参数使用;
案例: