java中的泛型(二)——泛型接口以及泛型方法

        在上一篇文章中,简要地对泛型的概念以及泛型类的使用进行了说明。除了在泛型类之外,泛型还可以在接口和方法中使用。

泛型接口

        对于泛型接口,它的声明方式为: public interface 接口名 <泛型>{泛型定义的抽象方法}。这个声明方式和泛型类的声明方式基本一致。在定义了泛型接口后,在实现这个泛型接口的时候,要求我们指定泛型所代表的具体类型。比如在下面的这个演示代码中,定义了泛型抽象接口Igeneric,用泛型T来代表数据类型,因此在抽象方法中就可以使用泛型T来代表方法返回的的类型以及方法中需要传入的参数的类型。这里要注意泛型接口定义时的泛型与抽象泛型方法中使用的泛型的关系。

        在泛型接口Igeneric的实现接口IgenericIme中,我们给定了泛型T的具体类型为String,这时如果通过实现类IgenericIme来创建对象,那么创建的对象中的数据类型就是String类。在这里就必须说到实例化对象的不同方式——通过接口实例化对象以及通过实现类实例化对象。在通过泛型接口的的实现类来实例化对象的时候,它的实例化方式与普通类的实例化没有区别,比如在下面演示代码中的igenericIme。但是当我们用泛型接口来实例化对象的时候就要特别注意,这种实例化方式要指定泛型所代之的类型并且还要指定特定的实现类,它的语法格式为:泛型接口名称<泛型指代的类型> 对象名称 = new 泛型接口的实现类名称();。就像演示代码中的对象igeneric以及对象igeneric1一样,并且要注意,尖括号中的泛型指代的类型要和接口的实现类中的保持一致,如果将对象igeneric中的泛型指代的名称输入为Integer,那么因为和后面的实现类中的泛型不同,所以程序无法通过编译。

package com.generic.demo;/*** 泛型接口*/
public interface Igeneric<T> {abstract T getName(T name);
}
package com.generic.demo;/*** 泛型接口的实现类*/
public class IgenericIme implements Igeneric<String >{@Overridepublic String  getName(String name) {return name;}
}
package com.generic.demo;public class IgenericIme1 implements Igeneric<Integer>{@Overridepublic Integer getName(Integer name) {return name;}
}
package com.generic.demo;public class TestIgeneric {public static void main(String[] args) {//通过实现类实例化IgenericIme igenericIme = new IgenericIme();String name1 = igenericIme.getName("尚学堂");System.out.println(name1);//通过接口实例化Igeneric<String> igeneric = new IgenericIme();String name2 = igeneric.getName("123");System.out.println(name2);Igeneric<Integer> igeneric1 = new IgenericIme1();Integer name3 = igeneric1.getName(125);System.out.println(name3);}
}

泛型方法

        静态泛型方法与非静态泛型方法

        在之前说的泛型类以及泛型接口的部分能够发现,我们定义在类和接口上的泛型在它们的方法中仍然可以使用,但是有时我们需要的仅仅是在一个指定的方法上使用泛型而不需要在整个类和接口上使用泛型,因此泛型方法的概念就被提出了。泛型方法指的是将方法中的参数类型定义为泛型,以便在调用时接收不同的参数类型的现象。泛型方法可以分为非静态泛型方法和静态泛型方法。在定义泛型方法时,参数类型一般放到返回值前面,并且需要说明的是如果返回值类型不是void的情况下,返回值类型仍然定义为泛型。此外,调用泛型方法时不需要像泛型类和泛型接口那样指定泛型的类型,系统能够自动判断出泛型的类型,因此泛型方法的调用和普通方法没有区别。

        非静态泛型方法的语法结构:

        public <泛型表示符号> void 方法名(泛型表示符号 形式参数){}

        public <泛型表示符号> 泛型表示符号 方法名(泛型表示符号 形式参数){}

        静态泛型方法的语法够:

        public static <泛型表示符号> void 方法名(泛型表示符号 形式参数){}

        public static <泛型表示符号> 泛型表示符号 方法名(泛型表示符号 形式参数){}

        对于静态泛型方法和非静态泛型方法,除了在定义的格式上存在的细微区别外,还要特别注意,静态泛型方法时无法访问类上定义的泛型的,也就是说如果我们定义了一个泛型类,在这个类中定义静态泛型方法时必须在static后面定义泛型,而不能直接使用类上定义的泛型。

泛型方法与可变参数

        在泛型方法中和普通方法一样,传入的参数也可以是任意类型,包括像数组这种可变参数依旧可以传入方法,不过在泛型方法中用泛型定义可变参数的类型时要采用特殊的语法结构进行说明,它的具体语法格式为:

        public  (static) 泛型表示符号 泛型表示符号(void) 方法名 (泛型表示符号. . . 可变参数名称){}

在这个语法结构中要特别注意泛型表示符号与可变参数名称之间的符号. . .  ,它是用来区分普通参数和可变参数的标志。 

演示代码

package com.generic.demo;public class MethodGeneric01 {public <T> void setName(T name){System.out.println(name);}public <T> T getName(T name){return name;}public static <T> void setFlag(T flag){System.out.println(flag);}public static <T> T getFlag(T flag){return flag;}public <T> void method (T...args){for(T t:args){System.out.print(t+"\t");}System.out.println();}}
package com.generic.demo;public class TestMethodGeneric01 {public static void main(String[] args) {MethodGeneric01 methodGeneric01 = new MethodGeneric01();methodGeneric01.setName(123);methodGeneric01.setName("jiuju");MethodGeneric01 methodGeneric02 = new MethodGeneric01();String name1 = methodGeneric02.getName("dede");System.out.println(name1);Integer name2 = methodGeneric02.getName(1234);System.out.println(name2);System.out.println("___________________");//静态方法无法使用类上定义的泛型MethodGeneric01.setFlag("liuyi");Integer flag = MethodGeneric01.getFlag(123);System.out.println(flag);System.out.println("_____________________________");//泛型与可变参数:数组String[] arr1 = new String[]{"a","b","c"};Integer[] arr2 = new Integer[]{1,2,3,4};methodGeneric01.method(arr1);methodGeneric01.method(arr2);}
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[最新]CentOS7设置开机自启动Hadoop集群

安装好Hadoop后我们可以使用开机自启动的方式&#xff0c;节约敲命令的时间。注意是centOS7版本!!!和centOS6版本区别非常大!!! 1、切换到系统目录 [rootmaster ~]# cd /etc/systemd [rootmaster systemd]# ll total 32 -rw-r--r-- 1 root root 720 Jun 30 23:11 bootcha…

arcgis js 4.x加载SceneLayer并实现基于属性查询定位及高亮

一、代码 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1,maximum-scale1,user-scalableno"><title></title><link rel…

2周速通春招联想Lenovo机器学习算法岗-面经篇

联想校招官网-联想校园招聘 不得不夸一下联想的效率&#xff0c;笔试到offer只用了两周。 先说教育背景&#xff1a;河南科技大学 本科&#xff0c;南京邮电大学 硕士。 时间线 4.x投简历&#xff0c;我一志愿是天津的岗位&#xff0c;想着天津新盖了厂房&#xff0c;容易进一…

政安晨:【Keras机器学习示例演绎】(十九)—— 可视化网络学习内容

目录 简介 设置 建立特征提取模型 设置梯度上升过程 设置端到端滤波器可视化回路 可视化目标层中的前 64 个滤波器 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&…

Java集合相关的List、Set、Map基础知识

目录 一、集合介绍 二、List 三、Map HashMap的数据结构 如何理解红黑树 四、set 一、集合介绍 在Java中&#xff0c;集合是一种用于存储对象的数据结构&#xff0c;它提供了一种更加灵活和强大的方式来处理和操作数据。Java集合框架提供了一系列接口和类&#xff0c;用…

[极客大挑战 2019]Upload、[ACTF2020 新生赛]Upload、[MRCTF2020]你传你呢

[极客大挑战 2019]Upload 打开环境&#xff0c;是上传一句话木马的题 先上传1.php试试&#xff0c;发现不可以 试试改后缀为phtml&#xff0c;提示语句中不能包含<?&#xff0c;只能改木马&#xff1a; <script language"php">eval($_POST[line]);</sc…

牛客NC368 质数的计数【中等 基础数学,数论 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/190167d1990442da9adb133980259a27 思路 判断x是否是质数&#xff1a;这是判断质数最好的代码了public boolean isPrime(int x){if(x 2 || x3) return true;if(x%6!1 && x%6!5) return false; //不在6倍…

C语言:插入排序

插入排序 1.解释2.步骤3.举例分析示例结果分析 1.解释 插入排序是一种简单直观的排序算法&#xff0c;它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常采…

【10-逻辑回归分类器:Scikit-learn中的二元分类实战】

文章目录 前言逻辑回归简介设置Scikit-learn环境选择数据集数据预处理训练逻辑回归模型模型评估优化模型结论前言 分类问题是机器学习中最常见的任务之一,而逻辑回归是处理二元分类问题的一种强大且直观的技术。本篇博文将深入探讨如何在Scikit-learn中实现逻辑回归分类器,并…

Hadoop之路

hadoop更适合在liunx环境下运行&#xff0c;会节省后期很多麻烦&#xff0c;而用虚拟器就太占主机内存了&#xff0c;因此后面我们将把hadoop安装到wsl后进行学习,后续学习的环境是Ubuntu-16.04 &#xff08;windows上如何安装wsl&#xff09; 千万强调&#xff0c;有的命令一…

深度学习运算:CUDA 编程简介

一、说明 如今&#xff0c;当我们谈论深度学习时&#xff0c;通常会将其实现与利用 GPU 来提高性能联系起来。GPU&#xff08;图形处理单元&#xff09;最初设计用于加速图像、2D 和 3D 图形的渲染。然而&#xff0c;由于它们能够执行许多并行操作&#xff0c;因此它们的实用性…

java-Spring-(MyBatis框架-xml管理)

目录 前置条件 xml与注解比较 1.1 xml定义 1.2 和SQL注解比较 建包准备 插入数据 ​编辑 更新数据 删除数据 查询数据 查看单字段查询 &#x1f3f7;&#x1f4a3;前置条件 创建一个spring boot 初始化的项目 &#x1f3f7;&#x1f4a3;xml与注解比较 1.1 xml定义 …