首页 > 其他分享 >泛型

泛型

时间:2024-03-07 22:35:50浏览次数:12  
标签:fun1 ArrayList public 泛型 new class

泛型

在此之前的集合,我们使用的时候,可以传入不同的数据类型的元素。
但是,实际开发中,一个集合只能够存储一种数据类型,为了就是将来获取元素处理的时候,处理方式能够统一
之前也学习过一种容器,这种容器在定义的时候,就明确了元素的数据类型(数组)
现在集合想要模仿使用定义数组时的特点,可以明确一个集合元素的数据类型。java为了实现这样的功能,提供了一个技术给我们使用:泛型

语句定义格式:<引用数据类型>

泛型的好处:
    1、消除了程序中大部分的黄色警告
    2、在获取元素的时候,不需要做向下转型
    3、限制了集合存储的数据类型,将来处理的方式统一
package com.shujia.day13;
import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo1 {
    public static void main(String[] args) {
        //加入泛型创建集合对象
        //ArrayList<E>()
        ArrayList<String> list = new ArrayList<String>();//这里前面写了类型,后面的<>就可以不写了,能自动判断类型
        //String[] arr;  类似数组的定义

        //创建元素对象并添加到集合中
        list.add("java");
        list.add("hadoop");
        list.add("hive");
        list.add("java");
        list.add("hbase");
//      list.add(12);  //因为前面限制了只能放String类型的,这里无法存放int类型的

        //迭代器遍历
        Iterator<String> iterator= list.iterator();
        while(iterator.hasNext()){
            String s= iterator.next();  //现在不需要进行向下转型,直接获取元素
        }
    }
}
package com.shujia.day13;
/*
    1.开发代码的时候,写的泛型,将来使用的时候,应该传入一个引用数据类型给到开发时的泛型中接收
    
    2.可以将类当作参数一样进行传递
      <>中应该定义一个变量,用于接收将来使用时传入的引用数据类型,优点类似形式参数的味道
    
    3.要符合标识符的命名规则
      将来开发时,如果泛型中只需要接收一个引用数据类型,定义时,只需要写一个大写的字母
 */

class Demo1<E>{
    //E在一个类中是唯一的
    public void fun1(E a){
        System.out.println(a);
    }
}
/*
    泛型类:在开发代码的时候,将泛型写在类上
 */
public class FanXingDemo1 {
    public static void main(String[] args) {
        Demo1<String> stringDemo1=new Demo1<>();
        stringDemo1.fun1("12");
    }
}
package com.shujia.day13;


class Demo2{
    //泛型方法,将来调用时可以传入任意的数据类型,与类上面的泛型无关
    public <E> void fun1(E e){
        System.out.println(e);
    }
}

/*
    泛型方法:将泛型定义在方法上
 */
public class FanXingDemo2 {
    public static void main(String[] args) {
        Demo2 demo2 = new Demo2();
        demo2.fun1("da");
        demo2.fun1(12);
        demo2.fun1(12.34);
    }
}
package com.shujia.day13;

import java.util.ArrayList;
import java.util.List;

interface Inter<E>{
    void fun1(E e);
}
//如果一个类实现一个接口,这个接口有泛型的话,在类定义的时候也要有泛型,一般情况下与接口的泛型写法一致
class Demo3<E> implements Inter<E>{
    @Override
    public void fun1(E e) {

    }
}

/*
    泛型接口:将泛型定义在接口上
 */
public class FanXingDemo3 {
    public static void main(String[] args) {
        Inter<String> s=new Demo3<>();
        s.fun1("ababa");

        /*
        interface List<E>
        class ArrayList<E> implements List<E>{
            add(E e){}
        }
         */
        ArrayList<String> list = new ArrayList<>();
        list.add("asdf");
        System.out.println(list);
    }
}

开发程序时,泛型的高级用法:

泛型通配符 :

<?>

任意类型,如果没有明确,那么就是Object以及任意的Java类了

package com.shujia.day13;
import java.util.ArrayList;

class Animal{
}

class Dog extends Animal{
}

class Cat extends Animal{
}

public class FanXingDemo4 {
    public static void main(String[] args) {
        ArrayList<?> list1 = new ArrayList<Dog>();//这里前面的填了?,后面的类可以填任意的
    }
}

? extends E

向下限定,E及其子类

package com.shujia.day13;

import java.util.ArrayList;

/*
    开发程序时,泛型的高级用法:
        泛型通配符<?>
            任意类型,如果没有明确,那么就是Object以及任意的Java类了
        ? extends E
            向下限定,E及其子类
        ? super E
            向上限定,E及其父类

 */
class Animal{
}

class Dog extends Animal{
}

class Cat extends Animal{
}

public class FanXingDemo4 {
    public static void main(String[] args) {
//        ArrayList<Animal> list1 = new ArrayList<>();
        //向下限定
//        ArrayList<? extends Animal> list1 = new ArrayList<Object>();
        ArrayList<? extends Animal> list1 = new ArrayList<Dog>();

    }
}

Collection<? extends E> 表示将来应该传入一个Collection集合对象,并且集合中的元素类型是E本身或者是E的子类类型(注意红色方框处填写的是无法传入的)

image-20240307200352253

现在来创建一个新的类Demo4

package com.shujia.day13;
import java.util.ArrayList;
import java.util.Collection;

class Animal{
}

class Dog extends Animal{
}

class Cat extends Animal{
}

class Demo4<E>{
    public void fun1(Collection<? super E> e){

    }
}
public class FanXingDemo4 {
    public static void main(String[] args) {
        ArrayList<Animal> list1 = new ArrayList<>();
        //向上限定
        Demo4<Animal> d = new Demo4<>();
        //fun1(Collection<? super E> e)
        //Collection<? super E> 表示将来应该传入一个Collection集合对象,但是集合中的元素类型只能是E的本身类型或者E的父类类型
        ArrayList<Dog> list2 = new ArrayList<>();
        ArrayList<Cat> list3 = new ArrayList<>();
        ArrayList<Object> list4 = new ArrayList<>();
//            d.fun1(list2);
//            d.fun1(list3);
            d.fun1(list4);
            d.fun1(list1);
    }
}

Collection<? super E> 表示将来应该传入一个Collection集合对象,但是集合中的元素类型只能是E的本身类型或者E的父类类型(注意红色方框处填写的是无法传入的)

image-20240307202525232

标签:fun1,ArrayList,public,泛型,new,class
From: https://www.cnblogs.com/peculiar/p/18059936

相关文章

  • 泛型
    简介C#中的泛型是一种强大的特性,允许你编写可重用的代码,而不必为不同的数据类型编写多个版本。通过泛型,你可以创建类、方法和接口,以便它们可以在编译时指定具体的数据类型。这使得代码更加灵活、类型安全,并且可以提高性能。案例泛型允许我们编写代码时指定类型参数,以便在运行......
  • JAVA API:ArrayList(泛型类)基本使用
    ArrayList代表的是一种集合,一种容器,类似于数组。 容器主要操作:增删改查   packagecom.itheima.ArrayList;importjava.util.ArrayList;importjava.util.List;publicclassdemo{publicstaticvoidmain(String[]args){ArrayListlist=new......
  • 43泛型算法和绑定器
    泛型算法和绑定器泛型算法是STL库里面定义的一些算法,这些算法可以用一个接口操作各种数据类型,因此称为泛型算法。#include<algorithm>泛型算法接受的都是迭代器,这是为了统一形式同时可以额外接受函数对象,更改泛型算法的功能绑定器当需要一个一元函数对象,但需要使用一......
  • 精简实现、线程安全:C#通用单例泛型基类助你轻松创建单例模式
     概述:该通用单例泛型基类使用C#实现,线程安全,通过泛型参数和Lazy<T>实现简化的单例模式。优点包括线程安全、泛型通用性、简化实现、以及延迟加载的特性。优点:线程安全: 使用Lazy<T>确保了线程安全的延迟初始化,避免了在多线程环境下可能导致的竞态条件问题。泛型通用性: 通......
  • 07. 泛型事件框架
    事件监听和发布我们要实现这样一个功能,当玩家在Map场景中点击一个图标的时候,需要发送事件给场景管理器,场景管理器监听事件,然后执行切换场景的操作在勇士传说中,我们使用ScriptableObject.UnityAction发布事件,以及监听事件,那时候每种类型都有一个ScriptableObject,非常繁琐。......
  • 深入浅出Go语言:泛型入门指南
    深入浅出Go语言:泛型入门指南原创 麻凡 麻凡 2024-03-0109:00 湖南 听全文随着Go1.18版本的发布,泛型正式成为了Go语言的一部分。泛型为Go开发者带来了更强大的类型抽象能力,允许我们编写更加灵活和可复用的代码。本文将带你了解Go泛型的基础知识,让你快速上手这一新特......
  • 【STL和泛型编程】4. hashtable、unordered_set、unordered_map
    1.hashtable前置知识:【数据结构】3.跳表和散列 基本原理:将Key计算成一个数值,然后取余数得到它在表头中的位置table(篮子)里每个指针都指向一个链表(桶)来存储余数相同的值如果桶内的元素个数比篮子个数还多,则将篮子的大小扩充篮子是vector,数量是质数,初始为53,53扩充后为97......
  • 【STL和泛型编程】3. set、map分析(及typename起源)
    前置知识:红黑树原理 【数据结构】7.平衡搜索树(AVL树和红黑树),红黑树的平衡性有利于search和insert红黑树的迭代器begin()左侧end()右侧迭代顺序56781011121315不能使用迭代器修改Key的值,例如将6改成50会破坏红黑树的性质1.RB-tree在g++编译......
  • Rust的ToOwned特征:泛型版的Clone
    std::borrow::ToOwned是Rust标准库中的一个特征,用于从借用的数据中创建一个具有所有权的副本。它的作用和Clone是一样的,但是相比Clone,它支持泛型;也就是说我们可以将一个类型T“Clone”为另一个类型U。这对处理一些特殊的类型来说很有用。ToOwned的签名ToOwned提供了两个方法,其中......
  • 泛型
    泛型的理解和好处看一个需求请编写程序,在ArrayList中,添加3个Dog对象Dog对象含有name和age,并输出name和age(要求使用getXxx0)先使用传统的方法来解决->引出泛型classDog{publicStringname;publicintage;publicDog(Stringname,intage){......