泛型
1.泛型的作用:
-
1、不限制类型 ,不限制和不给定泛型,默认是Object类型是一样的效果,可以简单的理解为将Object类型显示的给指明出来,但是呢,不明确的说是Object类型,而是换了一种形式,使用泛型代替(一个字母);
-
2、限制类型,限制集合中所能存储的数据类型,不用强制类型转换,将错误提前到了编译时期。
-
3.特殊字符:<>
-
4.不限制类型:现在有很多个查询功能,返回的都是List集合,操作流程和方式是一样的,但是集合中存储的类型不同,
2.泛型的用法:
* 遍历集合输出字符串及其长度
* 要求:集合中的数据类型必须是一致的
* 泛型:jdk1.5版本,安全机制,将异常从运行时提前到了编译时,也不需要进行强制类型转换
* 特殊符号:<数据类型>
package cn.yunhe.fx;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 泛型有两大用途
* 1、限制类型
* 2、不限制类型(集合本身的使用就是不限制类型的使用方式)
* 用途:可以封装简化代码
* 可以在类上或方法上去定义类型
*/
public class FanXingDemo {
public static void main(String[] args) {
//method();
List<Object> itemList = Custom.getAll("商品");
for(int i=0;i<itemList.size();i++) {
Item item = (Item)itemList.get(i);
}
List<Object> UserList = Custom.getAll("用户");
for(int i=0;i<UserList.size();i++) {
User user = (User)itemList.get(i);
}
Custom<String> custom = new Custom<String>();
//custom.show(23);
custom.run(123);
ResponseResult result = new ResponseResult(200,"成功",UserList);
System.out.println(result);
}
public static void method() {
//ArrayList后面的泛型在1.7之前需要显示指明类型,1.8之后可以不写
List<String> list = new ArrayList<>();
list.add("hahah");
//list.add(4562);
list.add("apple");
Iterator<String> it = list.iterator();
while(it.hasNext()) {
//使用instanceof进行判断时为了保证程序在运行状态下不至于出现问题
//String str = (String)it.next();
String str = it.next();
System.out.println(str+"--"+str.length());
}
}
/**
* 用于获取对应的商品信息列表
* @return
*/
public static List<Item> getItems() {
//此处应该是要连接数据库,获取数据,将数据存储到集合中
List<Item> itemList = new ArrayList<Item>();
itemList.add(new Item());
return itemList;
}
/**
* 获取对应的用户信息列表
* @return
*/
public static List<User> getUsers(){
List<User> userList = new ArrayList<User>();
return userList;
}
public static void entrySetMethod() {
Map<String, Object> map = new HashMap<>();
map.put("name", "校长");
map.put("age",13);
//遍历
Set<Map.Entry<String,Object>> set = map.entrySet();
Iterator<Map.Entry<String, Object>> it = set.iterator();
while(it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
String key = entry.getKey();
Object value = entry.getValue();
System.out.println(key+"--"+value);
}
}
}
3.封装应用:
-
该类中封装了所有数据类型需要用到的请求数据的功能
-
Object是所有类的超类(类的统称),语义不是很明确
-
因此会选择使用26个英语字母来代替,在开发语言中所有的命名都是以英语为主的
-
在使用的时候只需要将对应含义的英语单词的首字母来作为类型即可,例如:KEY–K VALUE–V ELEMENT–E
-
但是,系统本身是无法直接识别英语作为一个类型,因此,就需要在使用之前先指定某个字母作为类型
-
指定方式:
-
在类上指定
-
该字母可以作为一个类型在整个类中使用
-
在方法上指定
-
该字母可以在该方法中作为一个类型使用
-
注意:自定义泛型不能用在静态变量或方法上
package cn.yunhe.fx;
import java.util.ArrayList;
import java.util.List;
public class Custom<A> {
private A a;
/**
*
* @param sql
* sql决定了该方法区数据库中获取的数据类型
* @return
*/
public static List<Object> getAll(String sql){
List<Object> list = new ArrayList<>();
return list;
}
public List<A> getAlls(String sql){
List<A> list = new ArrayList<>();
return list;
}
public void show(A a) {//A a = "afsg"; Object obj = "sda";
}
/*
* public int show(int a) { return a; }
*/
//在方法上定义类型 该类型要定义在修饰符后,返回值类型前
public <B> void run(B b) {
System.out.println(b);
}
}
4.实例应用:
- 请求返回通用类
- 发送某些请求的时候,不管请求的结果是什么,服务器都会给出一个结果
- 请求成功:200 成功 数据
- 请求地址不对:404 失败 数据(错误信息)
package cn.yunhe.fx;
import java.util.List;
public class ResponseResult {
/**
* 返回码
*/
private int code;
/**
* 请求结果信息
*/
private String msg;
/**
* 返回的数据
* ?代表通配符
*/
private List<?> data;
public ResponseResult() {}
public ResponseResult(int code,String msg) {
this.code = code;
this.msg = msg;
}
public ResponseResult(int code, String msg, List<?> data) {
super();
this.code = code;
this.msg = msg;
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<?> getData() {
return data;
}
public void setData(List<?> data) {
this.data = data;
}
@Override
public String toString() {
return "ResponseResult [code=" + code + ", msg=" + msg + ", data=" + data + "]";
}
}