泛型的概念:

java中泛型的类如何转换成指定的类 java泛型类的定义和使用_泛型

定义一个泛型的类

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){
        //
    }
}

java中泛型的类如何转换成指定的类 java泛型类的定义和使用_java中泛型的类如何转换成指定的类_02

斗地主综合案例

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