泛型 类 接口 方法 通配符

泛型

泛型类

what:

类型参数化

why use:

1. 输出时候是object类型 而不是真正类型转化麻烦
import java.util.ArrayList;
import java.util.List;

public class ObjectExample {
    public static void main(String[] args) {
        List<Object> list = new ArrayList<>();
        list.add("Hello");
        list.add(123); // 可以添加任何类型的对象

        // 运行时可能会出现 ClassCastException
        String str = (String) list.get(1); 
        System.out.println(str);
    }
}

一个盒子 什么类型都可以装

而不是 橘子 苹果 火龙果盒子

分别对应一个类

fault example:

package box;

import fruit.*;

public class box {
}


public class appleBox{
    private apple apple;
    private double length;
    private double width;
    private double heigth;
    private double count;
    private double weigth;
    appleBox(){

    }
    appleBox(apple apple,double length,double width,double heigth,double count,double weigth){
        this.apple = apple;
        this.length = length;
        this.width = width;
        this.heigth = heigth;
        this.count = count;
        this.weigth = weigth;


    }

public class orangeBox{
    private orange orange;
    private double length;
    private double width;
    private double heigth;
    private double count;
    private double weigth;
    orangeBox(){

    }
    orangeBox(orange orange, double length, double width, double heigth, double count, double weigth){
        this.orange = orange;
        this.length = length;
        this.width = width;
        this.heigth = heigth;
        this.count = count;
        this.weigth = weigth;


    }
    public class pitayaBox{
        private pitaya pitaya;
        private double length;
        private double width;
        private double heigth;
        private double count;
        private double weigth;
        pitayaBox(){

        }
        pitayaBox(pitaya pitaya,double length,double width,double heigth,double count,double weigth){
            this.pitaya = pitaya;
            this.length = length;
            this.width = width;
            this.heigth = heigth;
            this.count = count;
            this.weigth = weigth;


        }

}
  • 代码冗余:每个盒子类的逻辑几乎相同,只是类型不同,但需要重复编写。
  • 扩展性差:如果需要支持更多类型的水果,就需要继续添加更多的盒子类。
  • 维护困难:如果需要修改盒子的功能(如增加新的方法),需要在每个盒子类中逐一修改。

example:

bug1:构造函数不公开化 外部无法构造
/*
	构造函数公开化
	*/
    
    public boxGeneric(T fruit, double length, double width, double heigth, double count, double weigth) {
        this.fruit = fruit;
        this.length = length;
        this.width = width;
        this.heigth = heigth;
        this.count = count;
        this.weigth = weigth;

    }
泛型实例:
package box;

/*
what:
    generic 类型参数化
 */
public class boxGeneric<T> {
    /*
    what:
        不同部分只是水果类型 给他类型参数化
        但是我接收时候只能接收一种水果类型 然后对应对象确定了 是 苹果盒子/橘子盒子 然后就当苹果盒子正常使用
     */
    private T fruit;

    private double length;
    private double width;
    private double heigth;
    private double count;
    private double weigth;
	/*
	构造函数公开化
	*/
    
    public boxGeneric(T fruit, double length, double width, double heigth, double count, double weigth) {
        this.fruit = fruit;
        this.length = length;
        this.width = width;
        this.heigth = heigth;
        this.count = count;
        this.weigth = weigth;

    }

    public T getFruit() {
        return fruit;
    }

    public void setFruit(T fruit) {
        this.fruit = fruit;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getHeigth() {
        return heigth;
    }

    public void setHeigth(double heigth) {
        this.heigth = heigth;
    }

    public double getCount() {
        return count;
    }

    public void setCount(double count) {
        this.count = count;
    }

    public double getWeigth() {
        return weigth;
    }

    public void setWeigth(double weigth) {
        this.weigth = weigth;
    }
}

调用:
import box.boxGeneric;
import fruit.apple;

public class Main {
    public static void main(String[] args) {


        /*
        使用泛型水果盒子
         */
        apple apple = new apple();
        boxGeneric<fruit.apple> appleboxGeneric = new boxGeneric<>(apple, 1, 1, 1, 1, 1);
        System.out.println(appleboxGeneric.getFruit().getName());
    }



}
apple类型
package fruit;

public class apple {

    private final String name = "apple";


    public String getName() {
        return name;
    }
}
语法

创建 参数化类

class boxGeneric<T>(T fruit){
	T fruit;
	
}

创建泛型对象

new boxGeneric<>()

alt + enter

image-20250206145118086

接口使用

接口后要立马接收参数 类型参数

类后要立马接收参数 类型参数

接口

package interfaceModle;
/*
what:
    接口使用泛型 参数要紧紧跟着类呀
 */
public interface keyInterface<T> {
    /*
    接口函数返回类型为泛型
     */
    T getKey();
}

使用1:实现泛型接口的类 不是泛型类 实现类不用接收参数类型 接口还要由实现类给出参数 那么 我们自己指定接口的类型参数

这时实现类使用接口时候 要给出接口的类型参数 因为外部无法给出参数类型 只能我自己给,如果实现类 不给接口参数 默认给接口Object类型

package imple;

import interfaceModle.keyInterface;
/*
非泛型类 要给接口类型参数
 */
public class keyImple implements keyInterface<String> {


    @Override
    public String getKey() {
        return "This is a key ------ 并非generic 是由实现类直接指定类型";
    }
}

main:
/*
    what:
        实现类直接指定类型 的 实现类返回信息
     */
    public static void test2(){
        keyImple keyImple = new keyImple();
        System.out.println(keyImple.getKey());
    }

使用2:实现类接收外部的类型参数 接口泛型参数由实现类给出 则接口的类型参数 可以与实现类参数一致 ,也可以直接由实现类给出

package imple;

import interfaceModle.keyInterface;

/*
what:
    实现类接收类型参数 赋值给接口参数
 */
public class keyGenericImple<T,E> implements keyInterface<T> {
    private T key;
    private E value;

    public keyGenericImple(T key, E value) {
        this.key = key;
        this.value = value;
    }

    public E getValue() {
        return value;
    }

    public void setValue(E value) {
        this.value = value;
    }

    @Override
    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }
}

main
/*
    what:
        实现类接收类型参数 发给接口的类型参数
        确定类型参数 设置普通参数值 返回信息
     */
    public static void test3(){
        keyGenericImple<String, Integer> si = new keyGenericImple<>("你好", 114514);
        String key = si.getKey();
        Integer value = si.getValue();
        System.out.println(key + " = " + value);
    }

方法使用

在调用方法时候指明泛型的具体类型

泛型类 作用在 返回值 参数上 但 方法内部无法使用泛型

即 泛型类只在类内部使用 方法内部使用泛型需要泛型方法

how use:

  • 泛型类后面紧接所需要的参数
  • 泛型方法后面无需紧跟参数 但是 泛型方法需要被修饰所以泛型标志在函数名前面
  • 能用泛型方法里的泛型E,类的泛型T也可以用

how set parameter:

类的传递参数写在类的后面

getProduct<Integer> gp = new getProduct<>();

接口的类型参数写作接口后面


方法的类型参数写在 修饰符那里


泛型方法的类型参数 只能通过接收参数时候设置 方法泛型类型 其他没地方接收类型参数呀。。。。

example:

类管类的内部 方法管方法的内部及 方法返回值 方法参数

方法和类 同一个类型参数T 时候 设置一个T = 方法和类全部设置

泛型类 + 泛型方法设置参数

泛型方法

package methodGeneric;

import java.util.ArrayList;
import java.util.Random;

/*
what:
     给出任意类型列表 返回一个奖品
 */
public class getProduct<E> {

    /*
    what:
        方法接收任意类型集合 返回一个奖品
    how use:
        方法类型参数 修饰作用 所以在最前面 声明后 该方法返回值 形式参数都可以使用该类型
        接收任意类型奖品列表
    how set type parameter:
        1.接收参数时候设置参数中的类型参数时 设置方法类型的参数

     */
    Random rand = new Random();
    public <T> T getProductMethod(ArrayList<T> list) {

        return list.get(rand.nextInt(list.size()));
    }
}

传入泛型类 类型参数(类后面直接给出) 、泛型方法类型参数(方法参数设置参数)

/*
what:
    给出字符串类型奖品列表 返回奖品

 */

public static void test4(){
    ArrayList<String> list = new ArrayList<>();
    list.add("笔记本电脑");
    list.add("苹果手机");
    list.add("安卓手机");
    /*
    what:
        传给方法 抽出奖品
     */
    getProduct<Integer> gP = new getProduct<>();
    String product = gP.getProductMethod(list);
    System.out.println("取出奖品为:" + product);
}

/*
what:
    给出数字类型列表 抽出奖金
 */
public static void test5(){
    ArrayList<Integer> products = new ArrayList<>();
    products.add(1000);
    products.add(20000);
    products.add(300000);
    getProduct<Integer> gP = new getProduct<>();
    Integer product = gP.getProductMethod(products);
    System.out.println("你的奖金为:" + product);
}
careout:
  • 设置类泛型参数后 不一定设置方法的类型参数
  • 类和方法类型参数名字就算一样 也是相互独立的
  • 类的类型参数在实例化对象时设置
  • 方法类型参数在接收 形式参数时设置

泛型类设置类型参数–成员方法 仅泛型类类型参数接收

泛型方法 任意类型参数接收

泛型类的成员方法 无法静态

泛型方法 可以静态 泛型方法不是泛型类的成员方法

泛型成员方法:
{
        getProduct<Integer> gP = new getProduct<>();
        /*
        what;
            数组
         */
        int[] arr = {1000,20000,3000000};
        ArrayList<Integer> products = new ArrayList<>();
        for(int i = 0;i<arr.length;i++){
            products.add(arr[i]);
        }
        /*
        what:
            泛型实例化 给成员方法得到奖品
         */
        getProduct<Integer> gp = new getProduct<>();
        Integer product0 = gp.getProduct0(products);
        System.out.println(product0 + " " + product0.getClass().getName());
    }
public class getProduct<E> {
    Random rand = new Random();
    /*
    what:
        泛型类的成员方法  成员方法全部依赖泛型类 比如 泛型类的类型参数
        返回奖品
     */
    public E getProduct0(ArrayList<E> list) {
        return list.get(rand.nextInt(list.size()));
    }
    }
泛型方法;

    public <T, E, K, V> void getMessage(T t,E e,K k,V v){
        System.out.println(t + "\t" + t.getClass().getName());
        System.out.println(e + " \t" + t.getClass().getName());
        System.out.println(k + " \t" + k.getClass().getName());
        System.out.println(v + " \t" + v.getClass().getName());
    }
public static void test7(){
        getProduct<Integer> gp = new getProduct<>();
        gp.getMessage("aaa","bbb",false,true);
        System.out.println("------------");
        gp.getMessage(true,false,1,22.66);
    }

泛型可变参数

泛型方法上E… e 泛型方法前设置修饰符

public static <E> void constantParameterPrint(E... e){
        for(int i = 0;i<e.length;i++){
            System.out.println(e[i]);
        }
    }
public static void test7(){
        getProduct<Integer> gp = new getProduct<>();
        gp.getMessage("aaa","bbb",false,true);

        System.out.println("------------");
        gp.getMessage(true,false,1,22.66);

        System.out.println("------------");
        gp.constantParameterPrint(1,2,3,4,5);
        System.out.println("------------");
        gp.constantParameterPrint('a','b','c','d','e');
    }

类型通配符

difficult:

1.Box box 这是一个Box对象 指明Box对象形式参数 创建Box实例对象 而不是一个列表 ArrayLIst arrayList 创建一个ArrayList对象 指明 Number参数 创建arrayList 实例对象

why use:

​ 在用泛型对象作为参数时候 相当于实例化对象 这时候要给对象泛型类型发参数,说明函数有泛型类 实例化对象时 我们已经给该泛型 实例化对象设置了 泛型的类型 这时候 多种类型传入函数(泛型类 实例化对象已经指定) 这时候就会报错

interge 与 Number 在泛型类型参数里不能当作 父亲接收子 多态来理解

solve:

  • 方法重载?
    • 同名 不能形式参数 尽管泛型的接收类型参数不一样 但是他们都是泛型类 所以相同的参数 无法重载
  • Object 泛型类类型参数
    • 那么不利于上层接收调用 以为是Object类型

在函数形式参数 泛型类实例化对象 用问号代替类型参数 该泛型类接收所有类型的类型参数 然后实例化形式参数

example:

package typeWildcard;

public class test {

    /*
        what:
            模拟多次 不同类型的泛型对象传入含有通配符函数
            返回Object类型 但是上一层强转类型即可
     */
    public static void main(String[] args) {
        Box<Number> box1 = new Box<>();
        box1.setFirst(1);
        Number o = (Number)showBox(box1);
        System.out.println(o);
        System.out.println("-------------");
        Box<String> box2 = new Box<>();
        box2.setFirst("函数的形式参数 实例化 接收全部类型");
        String s = (String)showBox(box2);
        System.out.println(s);
    }
    /*
    what;
        函数的形式参数 实例化也需要指定泛型类的类型参数  这样无法多态

    public static void showBox(Box<Number> box){
        Number first = box.getFirst();

    }

    what effect:
        衬托无法多态  因为 形式参数 的类型都是泛型类 所以无法多态

    public static void showBox(Box<Integer> box){
        Number first = box.getFirst();

    }
    */

    /*
    what:
        1.对于函数形式参数为泛型类需要指明类型参数情况 使用问号 代表实例化时接收各种类型参数
        2.咱们使用Object接收 但是直接返回上一层因为上一层知道这个object是声明类型呀!!!
     */

    public static Object showBox(Box<?> box){

        return box.getFirst();
    }

}

~~~java
package typeWildcard;

/*
what:
    泛型类 当个函数形式参数实例化参数时候 必须要指定泛型类型参数
 */
public class Box<T> {
    T first;

    public T getFirst() {
        return first;
    }

    public void setFirst(T first) {
        this.first = first;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

打穿内网三重奏-红日7

靶机下载地址&#xff1a; 漏洞详情 (qiyuanxuetang.net) 攻击链路&#xff1a; DMZ区IP段为192.168.11.1/24 第二层网络环境IP段为192.168.52.1/24 第三层网络环境IP段为192.168.93.1/24 这里DMZ和攻击者我用的是192.168.11.1 这个网段&#xff0c;其他不变 这里我加了两张…

windows 10安装sqlyog详细步骤

sqlyog下载链接&#xff1a; 链接: https://pan.baidu.com/s/1D_iRna8V90omfHsKHyeBtg 提取码: bqht 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 1. 下载完以后解压&#xff0c;双击SQLyog-12.0.9-0.x64 2. 如下图&#xff0c;选择Ok 3 . 如图&#xff0c;点…

OpenAI 放王炸,将发布整合多项技术的 GPT-5,并免费无限使用,该模型有哪些技术亮点

对于 ChatGPT 的免费用户&#xff0c;将可以无限制地访问 GPT-5&#xff0c;但仅限于标准的智能级别。该级别会设定滥用限制&#xff0c;以防止不当使用(意思就是你得付费嘛)。 OpenAI CEO Sam Altman 今天在 X 上透露了 GPT-4.5 和 GPT-5 的最新发展计划。 OpenAI 将发布代…

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中&#xff0c;TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow&#xff08;点击查看&#xff09; 和 PyTorch&#xff08;点击查看&#xff09;。它们引领着 AI 开发的潮流&#xff0c;吸引着无数开发者投身其中。但这两大框…

UEFI PI PEI(2. PEI Services and Table)

PEI Services 1. PEI Services Table介绍 PEI Foundation建立了一个名为PEI Services Table的系统表&#xff0c;该表对系统中的所有Pre-EFI初始化模块&#xff08;PEIMs&#xff09;可见。 PEI Foundation在系统初始化时所需要的功能、命令或其他能力&#xff0c;会被抽象然…

2025常用的SEO工具有哪些?

在互联网时代&#xff0c;如何让自己的网站或内容脱颖而出&#xff0c;成为许多企业和个人站长们最关注的问题。而在这个过程中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;作为一种有效的提升网站曝光度和吸引流量的手段&#xff0c;已经成为了网站运营的核心之一。对…

Winform自定义控件与案例 - 一款功能丰富的自定义文本按钮(TextButton)控件

深入解析:TextButton —— 一款功能丰富的自定义文本按钮控件 在 WinForms 开发中,标准的按钮控件虽然能够满足基本需求,但在现代 UI 设计中显得过于简单。为了提升用户体验和界面美观度,我们开发了 TextButton,一个基于 WWControlBase 的自定义文本按钮控件。它不仅支持…

安卓自我学习

纯粹三分钟热度, 这里 我百度查询资料, 按步骤创建了emtry 项目, 这里选择apk 12 , java 别问我kotlin, 啥都不会, …… 至于是叫小林学习,最初是在csdn 那里看到小林博主的文章, 激起一点点热度, 想学习一下 找了一圈 我先右上角选择 trouble ,, ,,看图1-1 图1-1 点运行…

【SpringBoot3.x+】slf4j-log4j12依赖引入打印日志报错的两种解决方法

最开始引入了1.7.5版本的slf4j-log4j依赖包&#xff0c;但是控制台不报错也不显示日志 在https://mvnrepository.com/找到最新的2.0.16版本之后出现报错&#xff1a; 进入提示的slf4j网站中可以找到从2.0.0版本开始&#xff0c;slf4j-log4j已经被slf4j-reload4j取代&#xff1…

LabVIEW袜品压力测试系统

开发了一种基于LabVIEW开发的袜品压力测试系统。该系统利用LabVIEW并结合灵敏的传感器和高精度的处理模块&#xff0c;实现了对袜品压力的精确测量和分析。系统不同于传统的服装压力测试方法&#xff0c;为研究和评价袜子的舒适性提供了新的测试手段。 ​ 项目背景 该系统的…

【Unity Shader编程】之顶点着色器

来一张AI提供的资料 一&#xff0c;坐标空间转换 空间转换中&#xff0c;一般有五个空间转换&#xff0c;模型空间→世界空间→视图空间→裁剪空间→NDC空间&#xff08;其次坐标空间&#xff0c;执行其次坐标后的空间)→屏幕空间 核心原则 1&#xff0c;数据依赖原则 当逻…

咸鱼换绑手机号能换ip属地吗?深入探讨

随着移动互联网的普及&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。而在各种网络应用中&#xff0c;手机号码往往扮演着重要的角色&#xff0c;它不仅是身份验证的关键&#xff0c;还关联着用户的地理位置信息。在二手交易平台如闲鱼上&#xff0c;用户的手机号和…

历史性突破!DeepSeek双模型GitHub热度超OpenAI,展现中国AI力量

在2025年2月7日&#xff0c;中国AI领域传来了一则振奋人心的消息&#xff1a;DeepSeek旗下的两大开源项目在GitHub平台上实现了历史性突破&#xff0c;其Star数成功超越了OpenAI的明星项目。这一成就不仅标志着DeepSeek在技术研发和市场影响力上的重大飞跃&#xff0c;也为中国…

【论文笔记】ZeroGS:扩展Spann3R+GS+pose估计

spann3r是利用dust3r做了增量式的点云重建&#xff0c;这里zeroGS在前者的基础上&#xff0c;进行了增量式的GS重建以及进行了pose的联合优化&#xff0c;这是一篇dust3r与GS结合的具有启发意义的工作。 abstract NeRF和3DGS是重建和渲染逼真图像的流行技术。然而&#xff0c;…

【CLIP系列】4:目标检测(ViLD、GLIP)

目录 1 ViLD2 GLIP2.1 前言2.2 损失计算2.3 模型框架 1 ViLD OPEN-VOCABULARY OBJECT DETECTION VIA VISION AND LANGUAGE KNOWLEDGE DISTILLATION 从标题就能看出来&#xff0c;作者是把CLIP模型当成一个Teacher&#xff0c;去蒸馏他自己的网络&#xff0c;从而能Zero Shot去…

基于Docker-compose的禅道部署实践:自建MySQL与Redis集成及故障排查指南

基于Docker-compose的禅道部署实践&#xff1a;自建MySQL与Redis集成及故障排查指南 禅道镜像版本&#xff1a;easysoft/zentao:21.4 Redis版本&#xff1a;redis:6.2.0 Mysql版本&#xff1a;mysql:8.0.35 文章目录 **基于Docker-compose的禅道部署实践&#xff1a;自建MySQL与…

Elasticsearch:同义词在 RAG 中重要吗?

作者&#xff1a;来自 Elastic Jeffrey Rengifo 及 Toms Mura 探索 RAG 应用程序中 Elasticsearch 同义词的功能。 同义词允许我们使用具有相同含义的不同词语在文档中搜索&#xff0c;以确保用户无论使用什么确切的词语都能找到他们所寻找的内容。你可能会认为&#xff0c;由于…

0基础学LabVIEW

对于零基础的朋友来说&#xff0c;学习LabVIEW需要一个科学的学习路径和方法。通过观看优质的B站教程打好基础&#xff0c;再结合实际项目进行实践操作&#xff0c;能够快速提升LabVIEW的应用能力。以下是从入门到进阶的学习建议。 ​ 一、利用B站入门教程打基础 筛选优质教程…

7. Docker 容器数据卷的使用(超详细的讲解说明)

7. Docker 容器数据卷的使用(超详细的讲解说明) 文章目录 7. Docker 容器数据卷的使用(超详细的讲解说明)1. Docker容器数据卷概述2. Docker 容器数据卷的使用演示&#xff1a;2.1 宿主 和 容器之间映射添加容器卷2.2 容器数据卷 读写规则映射添加说明2.3 容器数据卷的继承和共…

零售行业线下门店的AI知识库应用实践

在竞争激烈的零售行业&#xff0c;线下门店的运营效率和服务质量是企业成功的关键因素之一。随着AI技术的不断发展&#xff0c;越来越多的零售企业开始探索如何利用AI知识库提升线下门店的运营效率和员工服务水平。 1. AI知识库在零售行业的应用背景 零售行业面临着诸多挑战&…