Java中泛型的学习

泛型

1.概述
在前面学习集合时,我们都知道集合中是可以存放任意对的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。

public class Demo01Generic {
	public static void main(String[] args) {
		Collection coll = new ArrayList();
		coll.add("abc");
		coll.add("itcast");
		coll.add(5);//由于集合没有做任何限定,任何类型都可以给其中存放
		Iterator it = coll.iterator();
		while(it.hasNext()){
		//需要打印每个字符串的长度,就要把迭代出来的对象转成String类型
			String str = (String) it.next();
			System.out.println(str.length());
		}
	}
}

一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
2.泛型的好处
避免强制类型转换的麻烦
将运行时异常,提前到了编译时期,降低了程序员的工作量
一旦指定泛型,数据类型将被统一
实现代码的模板化,把数据类型当做参数传递

3.泛型类的定义

package diedaiqi;

public class Fan {
    public static void main(String[] args) {
        Te<String> stringTe = new Te<>();
        stringTe.setT("zhangsan");
        System.out.println(stringTe.getT());
        Te<Integer> integerTe = new Te<>(1000);
        System.out.println(integerTe.getT());
    }
}

class Te<T>{
    private T t;

    public Te() {
    }

    public Te(T t) {
        this.t = t;
    }

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
}

4.泛型方法

package fanxing;

public class DemoMethod {
    public static void main(String[] args) {
        MyMethod<String> ms = new MyMethod<>();
        ms.printmy("张三");
        ms.printhe("李四");
        ms.printhe(1000);
    }
}

class MyMethod<T>{
    //这是泛型类
    public void printmy(T t){
        System.out.println("这是泛型类");
    }

    public<E> void printhe(E e){
        System.out.println("这是泛型方法");
    }

}

5.泛型接口
方式一:在定义实现类的时候就明确泛型的类型

package fanxing;

public interface FanXing<T> {
    public abstract void show(T t);
}
package fanxing;

public class FanXingImpl implements FanXing<String>{
    @Override
    public void show(String t) {
        System.out.println(t);
    }
}

class Test{
    public static void main(String[] args) {
        FanXingImpl fa = new FanXingImpl();
        fa.show("张三");
    }
}

方式二:在定义实现类的时候不明确泛型类型,则实现类也要加上泛型

package fanxing;

public class FanXingImpl<T> implements FanXing<T>{
    @Override
    public void show(T t) {
        System.out.println(t);
    }
}

class Test{
    public static void main(String[] args) {
        FanXingImpl fa = new FanXingImpl();
        fa.show(1000);
    }
}

6.泛型通配符,?代表任意一种引用类型,只能用来匹配泛型,不能用来定义泛型。
注意:泛型是不存在多态的,创建集合对象时,左右两边的<>内容要保持一致。

7.泛型的上下限
一个类的子类可以有任意多个
?extends Person:表示Person类型或Person类型的任意子类型

泛型的上限:
?extend E:表示E类型或E类型的任意子类型
泛型的下限:
?super E:表示E类型或E类型的任意父类型

8.斗地主案例

package doudizhu;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

public class PockGame {
    //定义方法,准备牌
    public ArrayList<String> prepare(){
        //1.定义一个集合,存扑克牌
        ArrayList<String> pocks = new ArrayList<>();
        //2.定义一个集合,存花色
        ArrayList<String> colors = new ArrayList<>();
        //3.定义一个集合,存数字
        ArrayList<String> nums = new ArrayList<>();
        //4.添加花色
        colors.add("♠");
        colors.add("♥");
        colors.add("♣");
        colors.add("♦");
        //5.添加数字
        nums.add("A");
        for (int i = 2; i <=10 ; i++) {
            nums.add(i+"");
        }
        nums.add("J");
        nums.add("Q");
        nums.add("K");

        //6.将花色和数字组合加入扑克中
        for (int i = 0; i <colors.size() ; i++) {
            for (int j = 0; j <nums.size() ; j++) {
                pocks.add(colors.get(i) + nums.get(j) );
            }
        }

        //7.添加大小王
        pocks.add("小王");
        pocks.add("大王");

        return pocks;
    }


    public static void main(String[] args) {
        PockGame po = new PockGame();
        ArrayList<String> pocks = po.prepare();
        //打乱牌的顺序
        Collections.shuffle(pocks);
        //发牌
        //1.定义三个玩家和底牌
        ArrayList<String> p1 = new ArrayList<>();
        ArrayList<String> p2 = new ArrayList<>();
        ArrayList<String> p3 = new ArrayList<>();
        ArrayList<String> bottom = new ArrayList<>();
        //2.发牌并预留三张底牌
        for (int i = 0; i < pocks.size() ; i++) {
            if (i>=51){
                bottom.add(pocks.get(i));
            }else if (i % 3 == 0){
                p1.add(pocks.get(i));
            }else if (i % 3 == 1){
                p2.add(pocks.get(i));
            }else{
                p3.add(pocks.get(i));
            }
        }
        //3.看牌
        System.out.println("p1玩家的牌" + p1);
        System.out.println("p2玩家的牌" + p2);
        System.out.println("p3玩家的牌" + p3);
        System.out.println("底牌" + bottom);
    }



}

9.类型擦除
泛型是java1.5版本才引进的概念,泛型信息只存在于代码编译阶段,在进入jvm之前,与泛型相关的信息会被擦除掉,称为类型擦除。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读