首页 > 编程语言 >Java 中的泛型机制

Java 中的泛型机制

时间:2024-02-02 17:25:08浏览次数:27  
标签:Java java Cat Animal 泛型 new 机制 public

泛型

  • JDK5.0之后推出的新特性:泛型
  • 泛型这种语法机制,只在程序编译阶段起作用,只给编译器参考的(运行阶段没用)
  • 使用泛型的好处:集合中存储的元素统一了
  • 从集合中取出来的元素类型是泛型指定的类型,不需要进行大量的“向下转型”
  • 泛型的缺点:集合中的元素缺乏多样性
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
* JDK5.0之后推出的新特性:泛型
* 泛型这种语法机制,只在程序编译阶段起作用,只给编译器参考的(运行阶段没用)
* 使用泛型的好处:集合中存储的元素统一了
* 从集合中取出来的元素类型是泛型指定的类型,不需要进行大量的“向下转型”
* 泛型的缺点:集合中的元素缺乏多样性
* */
public class GenericTest {
    public static void main(String[] args) {
        //不使用泛型机制 ,分析程序存在的缺点
        List mylist = new ArrayList();
        // 准备对象
        Cat c = new Cat();
        Bird b = new Bird();

        mylist.add(c);
        mylist.add(b);

        //遍历集合,取出Cat让它抓老鼠,取出Bird让他飞
        Iterator it = mylist.iterator();
        while(it.hasNext()){
            //没有这个语法,通过迭代器取出来的就是Object
            // Animal a = it.next();
            Object obj = it.next();
            // obj中没有move方法,无法调用,需要向下转型!
            if(obj instanceof Animal){
                Animal a = (Animal) obj;
                a.move();
            }
        }

        // 使用JDK5.0之后的泛型机制
        // 使用泛型List<Animal> 之后,表示List集合中只允许存储Animal类型的数据。
        List<Animal> myList = new ArrayList<Animal>();

        // 指定List集合中只能存储Animal,那么存储String就编译报错了。
        //这样用了泛型之后,集合中元素的数据类型更加统一了。
        //myList.add("abc");

        Cat c1 = new Cat();
        Bird b1 = new Bird();

        mylist.add(c1);
        mylist.add(b1);

        //遍历集合,取出Cat让它抓老鼠,取出Bird让他飞
        Iterator<Animal> it1 = mylist.iterator();
        while(it1.hasNext()){

           Animal a =  it1.next();
           a.move();
           //调用子类型特有的方法啊hi是需要向下转换的

        }


    }
}

class Animal{
    public void move(){
        System.out.println("动物在移动!");
    }

}
class Cat extends Animal{
    public void catchMouse(){
        System.out.println("猫抓老鼠!");
    }
}

class Bird extends Animal{
    public void fly(){
        System.out.println("鸟儿在飞!");
    }
}

泛型的自动类型推断机制(钻石表达式)

  • ArrayList<这里的类型会自动类型推断>(),JDK8之后
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
* 在JDK8之后引入了:自动类型推断机制(又称钻石表达式)*/
public class GentericTest02 {
    public static void main(String[] args) {
        // ArrayList<这里的类型会自动类型推断>(),JDK8之后
        List<Animal> myList = new ArrayList<>();
        myList.add(new Animal());
        myList.add(new Cat());

        Iterator<Animal> it = myList.iterator();
        while(it.hasNext()){
            Animal a = it.next();
            a.move();
        }

    }
}

自定义泛型

  • 自定义泛型的时候 <> 尖括号中的是一个标识符,随便写
  • java源代码中经常出现的是 E T 分别表示Element Type
/*
* 自定义泛型
自定义泛型的时候 <> 尖括号中的是一个标识符,随便写
java源代码中经常出现的是   E T   分别表示Element  Type

 */
public class GentericTest03<标识符随便写> {
    public void dosame(标识符随便写 o) {
        System.out.println(o);

    }

    public static void main(String[] args) {
        //new对象的时候指定了泛型是:String类型
        GentericTest03<String> gt = new GentericTest03<>();
        gt.dosame("sss");
        //类型不匹配
        //gt.dosame(11);
    }
}

标签:Java,java,Cat,Animal,泛型,new,机制,public
From: https://www.cnblogs.com/shijili/p/18003510

相关文章

  • Java 中的HashSet 和 TreeSet
    HashSetHashSet集合:无序不可重复方法HashSet集合的元素实际上是放到HashMap集合的Key中importjava.util.HashSet;importjava.util.Set;/**HashSet集合:无序不可重复**/publicclassHashSetTest{publicstaticvoidmain(String[]args){//演示一......
  • JAVA的一些冷门知识
    1、@Size可以用来校验数组长度。2、构造代码块,在构造函数之前被调用,静态构造代码块,只被调用一次,有点类似C#的静态构造函数。java中的四种代码块_java代码块的分类-CSDN博客3、匿名内部类是Java编程语言中一种特殊的类,它没有显式地定义类名,而是在创建对象时通过传递实现了某个......
  • JAVA二维数组
    二维数组介绍二位数组的每个元素都是一维数组二维数组在内存中的形式动态初始化1动态初始化2动态初始化3(列数不确定)静态初始化二维数组使用细节和注意事项......
  • Java泛型
    参考:磊叔的技术博客 : 聊一聊-JAVA泛型中的通配符T,E,K,V,?tutorialspoint: Java-Generics Java-泛型泛型的好处在没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参......
  • JAVA一维数组的赋值,拷贝,反转,扩容
    赋值(引用传递)拷贝反转扩容......
  • java中锁分类
    1.可重入锁和不可重入锁可以对临界区资源重复加锁,如synchronized、ReentrantLock2.公平锁和非公平锁FIFO,如果对⼀个锁来说,先对锁获取请求的线程⼀定会先被满⾜,后对锁获取请求的线程后被满⾜,那这个锁就是公平的。反之,那就是不公平的。ReentranLock支持公平锁和非公平锁,默认非公......
  • Java中使用StopWatch实现代码块耗时统计/计时某段代码执行
    场景Java实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(SpringAOP、AutoCloseable方式):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130970242上面讲了统计方法的耗时,实现和使用面向方法体。如果是在方法中,需要频繁统计一段段的代码块的耗时,可以使用St......
  • Java并发基础:CountDownLatch全面解析!
    内容概要CountDownLatch的优点在于能够简洁高效地协调多个线程的执行顺序,确保一组线程都完成后才触发其他线程的执行,适用于资源加载、任务初始化等场景。它提供了清晰的等待/通知机制,易于理解和使用,是提升多线程程序性能和可靠性的重要工具。核心概念CountDownLatch是java.util......
  • JAVA一维数组介绍和初始化
    一维数组概述一维数组的初始化(声明数组并开辟内存空间)动态初始化1动态初始化2静态初始化一维数组的使用细节......
  • Java将密码加盐加密存储和校验
    注册和登陆的时候,需要加密和校验,以下为加密和解密代码packageorg.ongoal.common.config;importorg.springframework.util.DigestUtils;importorg.springframework.util.StringUtils;importjava.util.UUID;publicclassPasswordUtil{/***加盐算法->格......