泛型(一)

news2024/11/18 19:40:37

泛型:标签(类型参数)

所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。

我们创建代码来看泛型的作用:

package com.rgf.jihe.Fanxing;

import org.junit.Test;

import java.util.ArrayList;

/**
 * 泛型的使用:
 * 1.jdk 5.0 新增的特性
 */
public class GenericTest {
    //在集合中使用泛型之前的情况:
    @Test
    public void  test1(){
        ArrayList list = new ArrayList();
        //需求:存放学生的成绩
        list.add(78);
        list.add(76);
        list.add(89);
        list.add(88);
        //问题一:类型不安全
      list.add("Tom");

        for (Object score:list){
            //问题二:强转时,可能出现ClassCastException
            int stuScore=(int)score;
            
            System.out.println(stuScore);
        }
    }

}

我们运行之后出现如下所示:

 我们了解到由于类型没有确定,导致出现错误。

我们来认识泛型:

package com.rgf.jihe.Fanxing;

import org.junit.Test;

import java.util.*;

/**
 * 泛型的使用:
 * 1.jdk 5.0 新增的特性
 * 2.在集合中使用泛型:
 * 总结:
 * (1)集合接口或集合类在jdk5.0时都修改为带泛型的结构。
 * (2)在实例化集合类时,可以指明具体的泛型类型。
 * (3)指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型
 * 比如:add(E e)   ---->实例化以后:add(Integer e)
 * (4)注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换
 * (5)如果实例化时,没有指明泛型的类型,默认类型为java.lang.Object类型。
 */
public class GenericTest {
    //在集合中使用泛型之前的情况:
    @Test
    public void test1() {
        ArrayList list = new ArrayList();
        //需求:存放学生的成绩
        list.add(78);
        list.add(76);
        list.add(89);
        list.add(88);
        //问题一:类型不安全
        // list.add("Tom");

        for (Object score : list) {
            //问题二:强转时,可能出现ClassCastException
            int stuScore = (int) score;

            System.out.println(stuScore);
        }
    }

    //在集合中使用泛型的情况:以ArrayList如下所示:
    //使用泛型的类型不能是基本数类型。据    
    @Test
    public void test2() {
        ArrayList<Integer> integers = new ArrayList<Integer>();
        integers.add(78);
        integers.add(87);
        integers.add(99);
        integers.add(65);
        //编译时,就会进行类型检查,保证数据的安全
        //integers.add("d"); 加入字符串时会直接报错。
        for (Integer score : integers) {
            //避免了强转操作
            int stuScore = score;
            System.out.println(stuScore);
        }
        System.out.println("=================");
        Iterator<Integer> iterator = integers.iterator();
        while (iterator.hasNext()) {
            //我们进入源码如下:
            //E next();
            Integer next = iterator.next();
            System.out.println(next);
        }

    }

    //在集合中使用泛型的情况:以HashMap为例:
    @Test
    public void test3(){
        Map<String, Integer> map = new HashMap<String,Integer>();
        map.put("Tom",87);
        map.put("Jery",87);
        map.put("Jack",67);
        //泛型的嵌套
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Integer> next = iterator.next();
            System.out.println(next);
        }

    }

}

test1运行之后如下所示:

test2运行之后如下所示:

test3运行之后如下所示:

泛型类、泛型接口: 

我们进行练习如下所示:

首先我们先进行创建一个泛型类:

package com.rgf.jihe.Fanxing;

/**
 * 如何自定义泛型结构:泛型类、泛型接口;泛型方法
 *
 */
public class GenericTest1<T> {
     String orderName;
     int orderId;
     //类的内部结构就可以使用类的泛型
    T orderT;
    public GenericTest1 (){}

    public GenericTest1(String orderName,int orderId,T orderT){
        this.orderName=orderName;
        this.orderId=orderId;
        this.orderT=orderT;
    }

    public  T getOrderT(){
        return  orderT;
    }
    public  void setOrderT(T orderT){
        this.orderT=orderT;
    }

    @Override
    public String toString() {
        return "GenericTest1{" +
                "orderName='" + orderName + '\'' +
                ", orderId=" + orderId +
                ", orderT=" + orderT +
                '}';
    }
}

 我们再创建如下两个继承泛型类的类,如下所示:

package com.rgf.jihe.Fanxing;
//SubOrder<T>:仍然是泛型类
public class SubOrder1<T> extends GenericTest1<T> {


}
package com.rgf.jihe.Fanxing;

public class SubOrder extends GenericTest1<Integer>{

}

我们进行测试如下所示:

package com.rgf.jihe.Fanxing;

import org.junit.Test;

/**
 * 1.关于自定义泛型类、泛型接口:
 *
 */
public class GenericTest11 {
   @Test
   public  void  test1(){
       //如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型为Object类型
       GenericTest1<Object> obj = new GenericTest1<>();
       obj.setOrderT(123);
       obj.setOrderT("dd");
       //要求:如果定义了类是带泛型的,建议在实例化时要指明类的泛型
       //实例化时指明类的泛型
       GenericTest1<String> obj1 = new GenericTest1<String>("oaderAA",1001,"order:AA");
       obj1.setOrderT("AA:hello");
       System.out.println(obj1);


   }
   @Test
   private void test2(){
       //由于子类要继承带泛型的父类的时,指明了泛型类型。则实例化子类对象时,不再需要指明泛型。
       SubOrder subOrder = new SubOrder();
       subOrder.setOrderT(55);
       SubOrder1<String> sub2 = new SubOrder1<String>();
       sub2.setOrderT("order2...");


   }


}

我们运行之后入下所示:

test1如下所示:

test2如下所示:

 

1.泛型类可能有多个参数,此时应将多个参数一起放在尖括号内。比如:<E1,E2,E3>

2.泛型类的构造器如下:public GenericClass(){}

而下面是错误的:public GenericClass<E>(){}

3.实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致。

4.泛型不同的引用不能相互赋值。

5.泛型如果不确定,将被擦除,泛型对应的类型均按照Object处理,但不等价于Object。经验:泛型要使用一路都用。要不用,一路都不用。

 6.如果泛型类是一个接口或抽象类,则不可创建泛型类的对象。

7.jdk1.7泛型的简化操作:ArrayList<Fruit> first=new ArrayList<>();

8.泛型的指定中不能使用基本数据类型,可以使用包装类替换。

9.静态方法中不能使用类的泛型

10.异常类不能是泛型的。

11.编译不通过:

T[] arr=new T[10];

我们应该按照如下进行编译:

T[] arr=(T[]) new Object[10];

12.父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型:

(1)子类不保留父类的泛型:按需实现

没有类型 擦除

具体类型

(2)子类保留父类的泛型:泛型子类

全部保留

部分保留

我们示例如下所示:

package com.rgf.jihe.Fanxing;

public class A<T,T1> {
    
}
//子类不保留父类的泛型
//(1)没有类型  擦除
class  A1  extends  A{//等价于class Son extends Father<Object,Object>{
    
}
//(2)具体类型
class A2 extends  A<String,Integer>{
}
//子类保留父类的泛型
//(1)全部保留
class  A3<T,T1> extends  A<T,T1>{
}
//(2)部分保留
class  A4<T1> extends A<Integer,T1>{
    
}

泛型方法:

 我们以Collection源码如下所示:

public interface Collection<E> extends Iterable<E> {

此即为泛型方法:

<T> T[] toArray(T[] a);

此泛型与接口实现的还不同,为T,与上面的E不同。

泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系。

换句话说:泛型方法所属的类是不是泛型类都没有关系。

泛型类:

package com.rgf.jihe.Fanxing;

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

/**
 * 如何自定义泛型结构:泛型类、泛型接口;泛型方法
 *
 */
public class GenericTest1<T>  {
     String orderName;

     int orderId;
     //类的内部结构就可以使用类的泛型
    T orderT;
    public GenericTest1 (){}

    public GenericTest1(String orderName,int orderId,T orderT){
        this.orderName=orderName;
        this.orderId=orderId;
        this.orderT=orderT;
    }

    public  T getOrderT(){
        return  orderT;
    }
    public  void setOrderT(T orderT){
        this.orderT=orderT;
    }

    @Override
    public String toString() {
        return "GenericTest1{" +
                "orderName='" + orderName + '\'' +
                ", orderId=" + orderId +
                ", orderT=" + orderT +
                '}';
    }
    //先在泛型类里面定义了一个泛型方法
    //泛型方法,可以声明为静态的。原因:泛型参数是在调用方法时确定的,并非在实例化类时确定。
    public <E> List<E> copyFromArrayToList(E[] arr) {
        ArrayList<E> list = new ArrayList<>();
        for (E e : arr) {
            list.add(e);
        }
        return list;
    }
}

测试泛型方法:

package com.rgf.jihe.Fanxing;

import org.junit.Test;

import java.util.List;

/**
 * 1.关于自定义泛型类、泛型接口:
 *
 */
public class GenericTest11 {
   @Test
   public  void  test1(){
       //如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型为Object类型
       GenericTest1<Object> obj = new GenericTest1<>();
       obj.setOrderT(123);
       obj.setOrderT("dd");
       //要求:如果定义了类是带泛型的,建议在实例化时要指明类的泛型
       //实例化时指明类的泛型
       GenericTest1<String> obj1 = new GenericTest1<String>("oaderAA",1001,"order:AA");
       obj1.setOrderT("AA:hello");
       System.out.println(obj1);


   }
   @Test
   public void test2(){
       //由于子类要继承带泛型的父类的时,指明了泛型类型。则实例化子类对象时,不再需要指明泛型。
       SubOrder subOrder = new SubOrder();
       subOrder.setOrderT(55);
       SubOrder1<String> sub2 = new SubOrder1<String>();
       sub2.setOrderT("order2...");
       System.out.println(sub2);

   }

    //测试泛型方法
    @Test
    public  void  test3(){
        GenericTest1<String> order=new GenericTest1<>();
        Integer[] arr=new Integer[]{1,2,3,4};
        //泛型发法在调用时,指明泛型参数的类型。
        //此时把Interger换成其他类型也是可以运行的。
        List<Integer> list = order.copyFromArrayToList(arr);
        System.out.println(list);
    }
}


我们运行之后如下所示:

 查看泛型类和泛型方法的使用情境。

我们在操作数据库的时候,往往一张表对应的相应的实体类,我们在操作的过程中不了解多个类,我们往往进行如下操作,我们将操作设置为DAO类,设置对应的实体类,然后设置对应实体类的操作类,即为CustomerDAO

.DAO,表的共性操作,即采用泛型类和泛型方法,我们示例如下所示:

package com.rgf.jihe.Fanxing;

import java.util.List;

/**
 * DAO:data(base) access object
 * 表的共性操作的DAO
 */
public class DAO<T>{
    //我们进行操作一张表,即进行操作一个类的时候,不确定是哪一个类,不确定我们添加<T>,
    //添加一条记录
public  void  add(T t){

}
    //删除一条记录
public  boolean  remove(int index){
    return false;
}
    //修改一条记录
public  void  update(int index,T t){

}
    //查询一条记录
public  T getIndex(int index){
    return  null;
}
    //查询多条记录
public List<T> getForList(){
    return  null;
}
//泛型方法
    //举例:获取表中一共有多少条记录?获取最大的员工入职时间?
public  <E> E getValue(){
    return null;
}

}

实体类Customer:

package com.rgf.jihe.Fanxing;

public class Customer {//此类对应数据库中的customer表

}

操作实体类的CustomerDAO:

package com.rgf.jihe.Fanxing;

public class CustomerDAO extends DAO<Customer> { //专门去操作数据库中的Customer表

}

实体类Student:

package com.rgf.jihe.Fanxing;

public class Student {
}

操作实体类的StudentDAO:

package com.rgf.jihe.Fanxing;

public class StudentDAO extends  DAO<Student> { //只能操作某一个表的DAO

}

通配符的使用:

package com.rgf.jihe.Fanxing;

import org.junit.Test;

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

/**
 * 1.泛型在继承方面的体现
 * 2.通配符的使用
 */
public class GenericTestc {

    /**
     * 1.泛型在继承方面的体现
     * 虽然类A是类B的父类,但是G<A>和G<B>不具备子父类关系,二者是并列关系。
     * 补充:类A是类B的父类,A<G>是B<G>的父类
     */
    @Test
    public void  test1(){
        Object obj=null;
        String str=null;
        obj=str;

        Object[] arr1=null;
        String[] arr2=null;
        arr1=arr2;

        List<Object> list1=null;
        List<String> list2=new ArrayList<String>();
        //此时的list1和list2不具有子父类关系
        //编译不通过
        //list1=list2;
        /**
         * 反证法:
         * 假设list1=list2;
         * list1.add(123);导致混入非String的数据。出错。
         */
        show(list1);
        show1(list2);
    }
    public  void  show1(List<String> list){
    }
    public void  show(List<Object> list){
    }

    @Test
    public void  test2(){
        List<String>  list1=null;
        ArrayList<String>  list2=null;
        list1=list2;
        List<String> li = new ArrayList<>();
    }


    /**
     * 2.通配符的使用
     * 通配符:?
     * 类A是类B的父类,G<A>和G<B>是没有关系的,二者共同的父类是:G<?>
     */
    @Test
    public  void  test3(){
        List<Object> list1=null;
        List<String> list2=null;
        List<?> list=null;
        list=list1;
        list=list2;
        //编译通过
      //  print(list1);
       // print(list2);

        //
        List<String> list3=new ArrayList<>();
        list3.add("AA");
        list3.add("BB");
        list3.add("CC");
        list=list3;
        //添加:对于List<?>就不能向其内部添加数据。
        //除了添加null之外
   //     list.add(null);
        //获取(读取):允许读取数据,读取的数据类型为Object.
        Object o = list.get(0);
        System.out.println(o);

    }
    public  void  print(List<?> list){
        Iterator<?> iterator = list.iterator();
        while (iterator.hasNext()){
            Object next = iterator.next();
            System.out.println(next);
        }
    }

}

运行之后如下所示:

 有限制的通配符:

package com.rgf.jihe.Fanxing;

import org.junit.Test;

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

/**
 * 1.泛型在继承方面的体现
 * 2.通配符的使用
 */
public class GenericTestc {

    /**
     * 1.泛型在继承方面的体现
     * 虽然类A是类B的父类,但是G<A>和G<B>不具备子父类关系,二者是并列关系。
     * 补充:类A是类B的父类,A<G>是B<G>的父类
     */
    @Test
    public void  test1(){
        Object obj=null;
        String str=null;
        obj=str;

        Object[] arr1=null;
        String[] arr2=null;
        arr1=arr2;

        List<Object> list1=null;
        List<String> list2=new ArrayList<String>();
        //此时的list1和list2不具有子父类关系
        //编译不通过
        //list1=list2;
        /**
         * 反证法:
         * 假设list1=list2;
         * list1.add(123);导致混入非String的数据。出错。
         */
        show(list1);
        show1(list2);
    }
    public  void  show1(List<String> list){
    }
    public void  show(List<Object> list){
    }

    @Test
    public void  test2(){
        List<String>  list1=null;
        ArrayList<String>  list2=null;
        list1=list2;
        List<String> li = new ArrayList<>();
    }


    /**
     * 2.通配符的使用
     * 通配符:?
     * 类A是类B的父类,G<A>和G<B>是没有关系的,二者共同的父类是:G<?>
     */
    @Test
    public  void  test3(){
        List<Object> list1=null;
        List<String> list2=null;
        List<?> list=null;
        list=list1;
        list=list2;
        //编译通过
      //  print(list1);
       // print(list2);

        //
        List<String> list3=new ArrayList<>();
        list3.add("AA");
        list3.add("BB");
        list3.add("CC");
        list=list3;
        //添加:对于List<?>就不能向其内部添加数据。
        //除了添加null之外
   //     list.add(null);
        //获取(读取):允许读取数据,读取的数据类型为Object.
        Object o = list.get(0);
        System.out.println(o);

    }
    public  void  print(List<?> list){
        Iterator<?> iterator = list.iterator();
        while (iterator.hasNext()){
            Object next = iterator.next();
            System.out.println(next);
        }
    }
    /**
     * 3.有限制条件的通配符的使用.
     * ? extends A:G<? extend A>可以作为G<A>和G<B>的父类的,其中B是A的子类
     * ?  super A:G<? super A>可以作为G<A>和G<B>的父类的,其中B是A的父类 ..  可以添加A和A的子类
     */
          @Test
    public void test4(){
              List<? extends Person> list1=null;
              List<? super Person>  list2=null;
              List<Student> list3=new ArrayList<Student>();
              List<Person>  list4=new ArrayList<Person>();
              List<Object> list5=new ArrayList<Object>();
              
              list1=list3;
              list1=list4;
             // list1=list5;
              
              //list2=list3;
              list2=list4;
              list2=list5;
              
              //读取数据:
              list1=list4;
              Person p = list1.get(0);
              //编译器不通过
              //Student p = list1.get(0);
              list2=list4;
              Object object = list2.get(0);
              //编译不通过
              //Person obj = list2.get(0);
              
              //写入数据:
              //编译不通过
              //list1.add(new Student());
              //编译通过
              list2.add(new Person());
              list2.add(new Student());
              
          }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/463110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 数据存储 ---->方式

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 关于Python基本语法学习---->可以参考我的这篇博客&#xff1a;《我在VScode学Python》 数据存储是指在数据加工处理过程中将产生的临时文件或加工结果以某种格式保存。 常用的数据存储格式包括 TXT、Exc…

Java线程池常见面试题详解

线程池 池化技术 池化技术是一种常见的编程技巧, 把一些能够复用的东西&#xff08;比如说数据库连接、线程&#xff09;放到池中&#xff0c;避免重复创建、销毁的开销&#xff0c;在需要时可以重复使用这些预先准备的资源&#xff0c;从而极大提高性能。(提前保存大量资源,…

人生路上就是要不断打破认知边界

2023-4-25分享新知1.多角度看问题&#xff0c;竭尽全力才能找到突破口。结合客户需求解决问题2.新产品&有用的产品对用户提供有价值的产品3.全力就是所有部门都参与开发新产品&#xff0c;好机会就是有时间开发新产品&#xff0c;好产品就是一家企业的底气&#xff0c;产品…

SpringBoot 2.7.X 一套代码适配多种数据库讲解(图文详细)

文章目录 SpringBoot 2.7.X 一套代码适配多种数据库讲解(图文详细)1 简介1.1 概述1.2 环境安装1.3 测试脚本 2 基于Mybatis 方式2.1 添加DatabaseIdProvider配置2.2 在Mybatis的XML中,指定SQL语句的databaseId标签2.3 控制器接口样例2.4 呈现效果 3 基于MP框架Wrapps条件构造器…

AutoGPT也有Web UI了

AutoGPT能够在你的电脑上做任何你想做的事情&#xff0c;并且我们在前面的文章中也介绍了其他的一些类似的应用。 但是AutoGPT最大的一个问题是只能通过命令行界面(CLI)运行&#xff0c;这样就算是专业的技术人员使用起来也很麻烦&#xff0c;想想Stable Diffusion&#xff0c…

关于jeecgboot中遇到的问题及解决方案

1&#xff0c;关于数据权限问题 目的&#xff1a;一个人对应多个部门&#xff0c;部门下可能有子部门&#xff0c;过滤数据权限 解决方案&#xff1a; 方案①&#xff08;不推荐&#xff09;&#xff1a;如果后台是手写的sql&#xff08;没有用到mybatis-plus&#xff09;&…

一文弄懂标识符的规则和instanceof关键字

“世间有吸引法则&#xff0c;在于你有没有价值&#xff0c;价值来于物质资本和精神资本” 标识符的命名规则 标识符的含义&#xff1a;是指在程序中&#xff0c;我们自己定义的内容&#xff0c;例如方法名&#xff0c;变量名或者类名 命名规则&#xff1a;&#xff08;硬性要…

AlgoC++第六课:BP反向传播算法

目录 BP反向传播算法前言1. MNIST2. 感知机2.1 前言2.2 感知机-矩阵表示2.3 感知机-矩阵表示-多个样本2.4 感知机-增加偏置2.5 感知机-多个输出2.6 总结2.7 关于广播 3. BP4. 动量SGD5. BP示例代码总结 BP反向传播算法 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xf…

PHP、一:概述

1.概念 2.wampsever安装 百度搜索直接下载 下图是解压后目录&#xff0c;所写文件必须写在www文件夹下。 例&#xff1a;www文件夹下新建1.php&#xff0c;phpinfo()查看当前版本等信息。 使用localhost访问 php版本切换&#xff1a; 鼠标左键点击wampserver&#xff0c;切…

git rebase

git rebase rebase 是一个……我觉得很麻烦的指令&#xff0c;不过没办法&#xff0c;公司算是有个软规定必须要使用 rebase。 rebase 的功能和 merge 很像&#xff0c;不过它能够保持一个相对干净的历史&#xff0c;继续举个例子&#xff0c;假设现在有一个新的功能开发好了…

Golang Gin HTTP 请求和参数解析

gin 网络请求与路由处理 我们介绍了Gin框架&#xff0c;并做了Gin框架的安装&#xff0c;完成了第一个Gin工程的创建。 创建Engine 在gin框架中&#xff0c;Engine被定义成为一个结构体&#xff0c;Engine代表gin框架的一个结构体定义&#xff0c;其中包含了路由组、中间件、…

26- OCR 基于PP-OCRv3的液晶屏读数识别

要点&#xff1a; 液晶屏识别示例github 地址 1. 简介 本项目基于PaddleOCR开源套件&#xff0c;以PP-OCRv3检测和识别模型为基础&#xff0c;针对液晶屏读数识别场景进行优化。主要是针对各种仪表进行识别&#xff1a; 2 安装环境 安装Git&#xff1a;Git 详细安装教程 # 首…

YOLOv8 Bug及解决方案汇总

Traceback (most recent call last): File “D:\Anaconda\Scripts\yolo-script.py”, line 33, in sys.exit(load_entry_point(‘ultralytics==8.0.83’, ‘console_scripts’, ‘yolo’)()) self.model, self.save = parse_model(deepcopy(self.yaml), ch=ch, verbose=verbos…

基于 Python 的 Meta AI —— SAM

Segment Anything Model&#xff08;SAM&#xff09;是 Facebook 的一个 AI 模型&#xff0c;旨在推广分割技术。在我们之前的文章中&#xff0c;我们讨论了 SAM 的一般信息&#xff0c;现在让我们深入了解其技术细节。SAM 模型的结构如下图所示&#xff0c;图像经过编码器得到…

【致敬未来的攻城狮计划】— 连续打卡第十三天:FSP固件库开发启动文件详解

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

《Spring MVC》 第八章 拦截器实现权限验证、异常处理

前言 Spring 提供了Interceptor 拦截器&#xff0c;可用于实现权限验证、异常处理等 1、拦截器 对用户请求进行拦截&#xff0c;并在请求进入控制器&#xff08;Controller&#xff09;之前、控制器处理完请求后、甚至是渲染视图后&#xff0c;执行一些指定的操作 1.1、定义…

UGUI中点击判断的原理

首选需要理解 EventSystem 中的代码结构&#xff0c;EventSystem 目录下包含4个子文件夹&#xff0c;分别是 EventData、InputModules&#xff0c;Raycasters 和 UIElements&#xff0c;UIElements 下是 UI Toolkit 相关代码&#xff0c;这里不做研究&#xff0c;主要关注其他三…

linux文件及文件内容查找命令总结

在linux环境下&#xff0c;我们经常要查找一个文件或者文件的内容&#xff0c;但搜索的命令有很多&#xff0c;这些命令都有什么区别&#xff0c;应该怎么选择和使用呢&#xff1f; 下面总结了一些常见的文件查找、内容查找的命令&#xff0c;收藏起来备用吧。 文件查找 where…

每日学术速递4.25

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Long-Term Photometric Consistent Novel View Synthesis with Diffusion Models 标题&#xff1a;具有扩散模型的长期光度一致的新视图合成 作者&#xff1a;Jason J. Yu, Feresh…

Python入门教程+项目实战-11.3节: 元组的操作方法

目录 11.3.1 元组的常用操作方法 11.3.2 元组的查找 11.3.3 知识要点 11.3.4 系统学习python 11.3.1 元组的常用操作方法 元组类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法&#xff0c;在本节的内容中&#xff0c;着重介绍元组类型的操作方法…