定义和使用含有泛型的接口和泛型通配符
泛型接口基本概念
之前所有的操作都是在类中直接使用泛型操作的,那么,对于JAVA来说,也可以在接口中定义及使用泛型。
声明泛型接口: interface 接口名称<接口标示>{}
interface Info<T> { public T getInfo(); }
如果现在一个子类实现此接口是没有进行正确的实现,则在编译时候会出现警告, 例子:
interface Info<T>{ // 在接口上定义泛型 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型 } class InfoImpl implements Info{ // 定义泛型接口的子类 public T getVar(){ return null ; } };
以上操作不是一个子类实现泛型最好操作,最好在实现的时候也指定其具体的泛型类型
泛型接口实现的两种方式
第一方式:定义子类,在子类上也声明泛型类型
package Thread1; interface Info<T>{ // 在接口上定义泛型 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型 } class InfoImpl<T> implements Info<T>{ // 定义泛型接口的子类 private T var ; // 定义属性 public InfoImpl(T var){ // 通过构造方法设置属性内容 this.setVar(var) ; } public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; } }; public class demo1{ public static void main(String arsg[]){ Info<String> i = null; // 声明接口对象 i = new InfoImpl<String>("李兴华") ; // 通过子类实例化对象 System.out.println("内容:" + i.getVar()) ; } };
第二方式:如果现在实现接口的子类不想使用泛型声明,则在实现接口的时候直接指定好具体的操作类型即可
interface Info<T>{ // 在接口上定义泛型 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型 } class InfoImpl implements Info<String>{ // 定义泛型接口的子类 private String var ; // 定义属性 public InfoImpl(String var){ // 通过构造方法设置属性内容 this.setVar(var) ; } public void setVar(String var){ this.var = var ; } public String getVar(){ return this.var ; } }; public class GenericsDemo25{ public static void main(String arsg[]){ Info i = null; // 声明接口对象 i = new InfoImpl("李兴华") ; // 通过子类实例化对象 System.out.println("内容:" + i.getVar()) ; } };
Java泛型通配符
Java语言是面向对象编程语言,在编程过程中对象的引用传递是最常见的。在泛型类的操作中,如果遇到了泛型的引用传递,那么必须要类型匹配才可以传递。那么实在是想让泛型引用传递,该怎么办呢?
我们可以使用通配符 " ? ",表示可以接收此类型的任意泛型对象
Java泛型通配符
列子:
定义一个泛型类
public class Point<T> { private T key; public T getKey() { return key; } public void setKey(T key) { this.key = key; } }
定一调用的测试类
public class TestParadigm { public static void main(String[] args) { System.out.println("aaa(www.aaa.com)"); Point<String> paramPoint = new Point<>(); paramPoint.setKey("欢迎来到aaa"); printInfo(paramPoint); System.out.println("结束"); } private static void printInfo(Point<?> point) { System.out.println(point.getKey()); } }
需要注意的是,我们在定义对象的时候,已经将变量的类型给确定了,这个时候可以对对象里面的属性进行赋值操作,但是如果在定义对象的时候使用通配符,即 Point<?> paramPoint = new Point<>();
这样的方式,那么在给对象赋值的时候,是不能够给对象里面的参数赋值的,只能设置为 null。
因为 java 语言里面的任何类的对象都可以置为 null
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)