当前位置: 首页 > news >正文

第一百一十一节 Java面向对象设计 - Java泛型方法和构造函数

Java面向对象设计 - Java泛型方法和构造函数

泛型方法

我们可以在方法声明中定义类型参数,它们在方法的返回类型之前的尖括号中指定。

包含泛型方法声明的类型不必是泛型类型。

我们可以在非静态方法声明中使用为泛型类型指定的类型参数。

例子

以下代码显示如何为方法m1()定义新的类型参数V.

新类型参数V强制方法m1()的第一个和第二个参数为相同类型。

第三个参数必须是相同的类型T,这是类实例化的类型。

class MyBag<T> {private T ref;public MyBag(T ref) {this.ref = ref;}public T get() {return ref;}public void set(T a) {this.ref = a;}
}
class Test<T>  {public <V>  void  m1(MyBag<V>  a, MyBag<V>  b, T  c)  {}
}

使用泛型方法

要传递方法的形式类型参数的实际类型参数,我们必须在方法调用中的点和方法名之间的尖括号<>中指定它。

class MyBag<T> {private T ref;public MyBag(T ref) {this.ref = ref;}public T get() {return ref;}public void set(T a) {this.ref = a;}
}
class Test<T> {public <V> void m1(MyBag<V> a, MyBag<V> b, T c) {}
}
public class Main {public static void main(String[] argv) {Test<String> t = new Test<String>();MyBag<Integer> iw1 = new MyBag<Integer>(new Integer(201));MyBag<Integer> iw2 = new MyBag<Integer>(new Integer(202));// Specify that Integer is the actual type for the type parameter for m1()t.<Integer>m1(iw1, iw2, "hello");t.m1(iw1, iw2, "hello");}
}

例2

以下代码显示了如何声明泛型静态方法。

我们不能在静态方法内引用包含类的类型参数。

静态方法只能引用它自己声明的类型参数。

以下静态通用类型定义了类型参数T,用于约束参数source和dest的类型。

class MyBag<T> {private T ref;public MyBag(T ref) {this.ref = ref;}public T get() {return ref;}public void set(T a) {this.ref = a;}
}public class Main {public static <T> void copy(MyBag<T> source, MyBag<? super T> dest) {T value = source.get();dest.set(value);}public static void main(String[] argv) {}
}

要为静态方法调用指定实际的类型参数,我们可以这样做:

Main.<Integer>copy(iw1, iw2);

泛型构造函数

我们可以为构造函数定义类型参数。

下面的代码定义了类Test的构造函数的类型参数U.

它放置一个约束,即构造函数的类型参数U必须是相同的,或者它的类类型参数T的实际类型的子类型。

public class Test<T> {public <U extends T> Test(U k) {}
}

要为构造函数指定实际的类型参数值,请在新运算符和构造函数名称之间的尖括号中指定它,如以下代码段所示:

class Test<T> {public <U extends T> Test(U k) {}
}public class Main {public static void main(String[] argv) {// Specify the actual type parameter for the constructor as DoubleTest<Number> t1 = new<Double> Test<Number>(new Double(1.9));// Let the compiler figure out, Integer is// the actual type parameter for the constructorTest<Number> t2 = new Test<Number>(new Integer(1));}
}

泛型对象创建中的类型推断

Java 7在泛型类型的对象创建表达式中增加了对类型推断的有限支持。

对于以下语句:

List<String> list = new ArrayList<String>();

在Java 7中,可以在上面的语句中指定空尖括号,称为菱形操作符或简单的菱形<>作为ArrayList的类型参数。

List<String> list = new ArrayList<>(); 

如果我们不在对象创建表达式中为泛型类型指定类型参数,那么类型是原始类型,编译器生成未检查的警告。

例如,以下语句将编译未选中的警告:

List<String> list = new ArrayList(); // Generates an  unchecked  warning

我们不能创建泛型的异常类。并且没有泛型的匿名类。

相关文章:

  • 13.3 Go 性能优化
  • 《Linux运维总结:prometheus+altermanager+webhook-dingtalk配置文件详解》
  • c++之说_15|成员函数的const尾缀修饰 ( const const)
  • 程序员们,能告诉我你们为什么选择arch linux吗?
  • LINUX内核权限提升漏洞(CVE-2024-1086)通告
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 目录管理器(200分) - 三语言AC题解(Python/Java/Cpp)
  • 【Science Data Bank】数据集下载脚本
  • python-日历库calendar
  • maven学习小结
  • ubuntu 22.04 升级到24.04
  • 手机号码的校验
  • 【昇思25天学习打卡营打卡指南-第一天】基本介绍与快速入门
  • 三分忙,七分瞎忙!明天起,做个清闲的打工人~
  • H5禁止页面缩放的方法汇总
  • 确保数据一致性
  • ES6系统学习----从Apollo Client看解构赋值
  • Java到底能干嘛?
  • Just for fun——迅速写完快速排序
  • TCP拥塞控制
  • Vue学习第二天
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 精彩代码 vue.js
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #includecmath
  • #pragam once 和 #ifndef 预编译头
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #数学建模# 线性规划问题的Matlab求解
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (3)(3.5) 遥测无线电区域条例
  • (CPU/GPU)粒子继承贴图颜色发射
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (算法)Game
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转)mysql使用Navicat 导出和导入数据库
  • .NET delegate 委托 、 Event 事件
  • .NET 反射的使用
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET6 命令行启动及发布单个Exe文件
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /etc/fstab和/etc/mtab的区别
  • /etc/skel 目录作用
  • /proc/vmstat 详解
  • [20170705]diff比较执行结果的内容.txt
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [acm算法学习] 后缀数组SA
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]