泛型的概念:
定义一个泛型的类
package Day12;/*
*@author wanghongyuan
*@Create 2020/12/20 19:54
定义一个泛型的类。
泛型是一个未知的数据类型,当我们不确定什么时候用什么类型的时候,可以使用泛型
泛型可以接收任意的数据类型。
创建对象的时候确定泛型的类型
*/
// 格式是 修饰符 class 类名称<代表泛型的变量>{//...........}
public class GenericClass<E> {
private E name;
public GenericClass() {
}
public GenericClass(E name) {
this.name = name;
}
public E getName() {
return name;
}
public void setName(E name) {
this.name = name;
}
}
使用泛型的类
package Day12;/*
*@author wanghongyuan
*@Create 2020/12/20 19:52
*/
public class Demo02GenericClass {
public static void main(String[] args) {
//不写泛型默认为Object类型
GenericClass ge = new GenericClass();
ge.setName("只能是字符串");
GenericClass<String> s = new GenericClass<>();
s.setName("333");
System.out.println(s.getName());
GenericClass<Integer> i = new GenericClass<>();
i.setName(23);
System.out.println(i.getName());
GenericClass<Boolean> d = new GenericClass<>();
d.setName(true);
System.out.println(d.getName());
}
}
定义一个含有泛型的方法
package Day12;/*
*@author wanghongyuan
*@Create 2020/12/20 20:42
定义含有泛型的方法,泛型定义在方法的修饰符和返回值类型之间
格式:
修饰符 <泛型> 返回值类型 方法名(参数列表(使用泛型)){
方法体
};
含有泛型的方法,在调用方法的时候确定泛型的数据类型。
传递什么类型的参数,泛型就是什么类型
*/
public class GenericMethod {
// 定义一个含有泛型的方法
public <M> void Method01(M m){
System.out.println(m);
}
// 定义一个含有泛型的静态方法
public static <M> void Method02(M m){
System.out.println(m);
}
}
使用含有泛型的方法
package Day12;/*
*@author wanghongyuan
*@Create 2020/12/20 20:48
*/
public class Demo03GenericMethod {
public static void main(String[] args) {
GenericMethod gm = new GenericMethod();
/*
调用含有泛型的方法method01
传递什么类型,泛型就是什么类型
*/
gm.Method01("刘德华");
gm.Method01(23);
gm.Method01(23.23);
gm.Method01(true);
gm.Method02("32");// 不建议通过对象调用静态方法
System.out.println("++++++++++++++++++++++++++++");
// 静态方法,通过类名.方法名(参数)可以直接使用
GenericMethod.Method02("23");
GenericMethod.Method02(12);
GenericMethod.Method02(8.4);
}
}
定义泛型的接口
package Day12;/*
*@author wanghongyuan
*@Create 2020/12/20 21:03
定义一个含有泛型的接口
*/
public interface GenericInterface<I>{
// 抽象类方法
public abstract void method(I i);
}
使用包含泛型的接口,第一种
package Day12;/*
*@author wanghongyuan
*@Create 2020/12/20 21:07
含有泛型的接口,第一种使用方式:定义接口的实现类,实现接口,并且指定接口的泛型。
public interface Iterator<E>{
E next();
}
Scanner类实现了Iterator接口,并指定接口的泛型为String,所以重写的next方法泛型默认就是字符串
public final class Scanner implements Iterator<String>{
public String next(){}
}
*/
public class GenericInterfaceImpl implements GenericInterface<String>{
@Override
public void method(String s) {
System.out.println(s);
}
}
使用包含泛型的接口,第二种
package Day12;/*
*@author wanghongyuan
*@Create 2020/12/20 21:07
含有泛型的接口,第二种使用方式:接口使用什么泛型,实现类就使用什么泛型,类跟着接口走
就想当于定义了一个含有泛型的类,创建对象的时候确定泛型的类型
比如说
public interface list<E>{
boolean add(E e);
E get(int index);
}
public class ArrayList<E> implements List<E>{
public boolean add(E e){};
public E get(int index){}
}
*/
public class GenericInterfaceImpl02<I> implements GenericInterface<I>{
@Override
public void method(I i) {
System.out.println(i);
}
}
测试泛型接口
package Day12;/*
*@author wanghongyuan
*@Create 2020/12/20 21:16
*/
/*
* 测试含有泛型的接口
*
* */
public class Demo04GenericInterface {
public static void main(String[] args) {
// 用第一种方法,创建GenericInterfaceImpl对象,在定义的时候
GenericInterfaceImpl ge = new GenericInterfaceImpl();
ge.method("23");
// ge.method(123);//报错,指定了字符串类型
// 用第二种方法,创建GenericInterfaceImpl02对象,创建的时候再指定类型。
GenericInterfaceImpl02<**String**> ge02 = new GenericInterfaceImpl02<>();
ge02.method("23423");
GenericInterfaceImpl02<**Double**> ge3 = new GenericInterfaceImpl02<>();
ge3.method(32.234);
}
}
泛型的通配符
package Day12;/*
*@author wanghongyuan
*@Create 2020/12/20 21:47
*/
import java.util.ArrayList;
/*
泛型的通配符:
?:代表任意的数据类型
使用方法:
不能创建对象使用
只能作为方法的参数使用
*/
public class Demo05Generic {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
ArrayList<String> list2 = new ArrayList<>();
list2.add("a");
list2.add("b");
list2.add("c");
printArray(list2);// 不报错可以适用多个类型
printArray(list);// 不报错可以适用多个类型
printArray2(list2);
// printArray2(list);//报错,不能适用两个类型
// printArray1(list2);//报错,不能适用两个类型
printArray1(list);
}
/*
定义一个方法,能遍历所有类型的Arraylist集合
这个时候我们不知道ArrayList集合使用什么数据类型,可以使用泛型的通配符?来接收数据类型
*/
// 这个?号如果写死为String
public static void printArray(ArrayList<?> list){
//
}
public static void printArray2(ArrayList<String> list){
//
}
public static void printArray1(ArrayList<Integer> list){
//
}
}
斗地主综合案例
package Day12;/*
*@author wanghongyuan
*@Create 2020/12/20 22:34
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
/*
斗地主综合案例:
1.准备牌
2.洗牌
3.发牌
4.看牌
*/
public class DouDiZhu {
public static void main(String[] args) {
// 1.准备牌
// 定义一个存储54张牌的ArrayList集合,泛型使用String
ArrayList<String> poker= new ArrayList<>();
String[] colors = {"♤","♡","♢","♧"};
String[] numbers={"A","K","Q","J","10","9","8","7","6","5","4","3","2"};
// 先把大王小王存储在扑克中
poker.add("大王");
poker.add("小王");
// 普通for循环
// for (int i = 0; i < colors.length; i++) {
// for (int i1 = 0; i1 < numbers.length; i1++) {
// poker.add(colors[i]+numbers[i1]);
// System.out.println(poker);
// }
// }
// 增强for循环
for (String number : numbers) {
for (String color : colors) {
// System.out.println(color+number);
// 把组装好的牌存到poker中
poker.add(color+number);
}
}
// 输出看看是不是放到集合中了
// System.out.println(poker);
/*
2.洗牌
使用集合工具类中的Collections中的方法
static void shuffle((list<?>) list)使用默认随机源对指定列表进行置换
*/
Collections.shuffle(poker);
// System.out.println(poker);
/*
3.发牌
定义四个集合,分别是玩家1-3和一个存放最后三张底牌的集合
*/
ArrayList<String> player1 = new ArrayList<>();
ArrayList<String> player2 = new ArrayList<>();
ArrayList<String> player3 = new ArrayList<>();
ArrayList<String> dipai = new ArrayList<>();
/*
遍历poker集合,获取每一张牌
使用poker集合的索引%3给三个玩家轮流发牌
剩余3张牌给底牌
注意:
先判断底牌(i>=51),否则牌就发完了。
*/
for (int i = 0; i < poker.size(); i++) {
String p = poker.get(i);
if (i>=51){
// 给底牌发牌
dipai.add(p);
}else if(i%3==0){
player1.add(p);
}
else if(i%3==1){
player2.add(p);
}
else if(i%3==2){
player3.add(p);
}
}
System.out.println("周润发"+player1);
System.out.println("周星驰"+player2);
System.out.println("刘德华"+player3);
System.out.println(dipai);
}
}
最后输出的结果
D:\Java\jdk-14.0.2\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.2.4\lib\idea_rt.jar=59261:D:\Program Files\JetBrains\IntelliJ IDEA 2020.2.4\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Administrator\IdeaProjects\DaYuanXue\out\production\DaYuanXue Day12.DouDiZhu
周润发[♡Q, ♤6, ♧5, ♤5, ♢3, ♡4, ♤Q, ♧8, ♧Q, ♢K, 小王, ♤3, ♢10, ♤J, ♡5, ♤8, ♧2]
周星驰[♤4, ♧J, ♢Q, ♤9, ♡3, ♡2, ♢5, ♢8, ♧9, 大王, ♢2, ♡J, ♧10, ♧3, ♧6, ♤2, ♧4]
刘德华[♢4, ♢7, ♡A, ♤7, ♡10, ♤A, ♤K, ♡6, ♢J, ♡K, ♢6, ♢9, ♤10, ♡9, ♧7, ♧A, ♧K]
[♢A, ♡8, ♡7]
Process finished with exit code 0