java 数据类型:<泛型>在方法中和在构造器中的应用
背景:
import java.util.ArrayList;
import java.util.List; /**
* @ClassName MethodTest
* @projectName: object1
* @author: Zhangmingda
* @description: 方法泛型的问题引出案例:当我们创建一个方法,数组中对象加到一个List集合中时,
* Java不允许我们把对象放在一个未知数据类型的集合中。
* date: 2021/4/11.
*/
public class MethodTest {
private static void arrayToList(Object[] objs, List<?> list) {
for (Object obj : objs) {
list.add(obj); //编译报错:因为Java不允许我们把对象放在一个未知数据类型的集合中。
}
}
public static void main(String[] args) {
Object[] strArr = {"李一桐", "刘亦菲", "鞠婧祎"};
List<String> list = new ArrayList<>();
arrayToList(strArr, list);
System.out.println(list);
}
}
为了解决这个问题,可以使用Java提供的泛型方法(Generic Method)。所谓泛型方法,就是在声明方法时定义一个或多个泛型形参。
方法的泛型数据类型
语法格式如下:
修饰符 <T , S> 返回值类型 方法名(形参列表){
方法体...
}
import java.util.ArrayList;
import java.util.List; /**
* @ClassName MethodTest
* @projectName: object1
* @author: Zhangmingda
* @description: 方法泛型的问题引出案例:当我们创建一个方法,数组中对象加到一个List集合中时,
* Java不允许我们把对象放在一个未知数据类型的集合中。
* date: 2021/4/11.
*/
public class MethodTest {
private static <T> void arrayToList(T[] objs, List<T> list) {
for (T obj : objs) {
list.add(obj); //List<?> list编译报错:因为Java不允许我们把对象放在一个未知数据类型的集合List<?> list中。
}
}
public static void main(String[] args) {
String[] strArr = {"李一桐", "刘亦菲", "鞠婧祎"};
List<String > list = new ArrayList<>();
arrayToList(strArr, list);
System.out.println(list); //[李一桐, 刘亦菲, 鞠婧祎]
}
}
两个或多个泛型时
import java.util.ArrayList;
import java.util.List; /**
* @ClassName MethodTest2
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/11.
*/
public class MethodTest2 {
private static <T,E>void printList(List<T> list, List<E> list1){
System.out.println(list);
System.out.println(list1);
}
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(3);
printList(list,list1);
}
}
构造器使用泛型
/**
* @ClassName InitTest
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/11.
*/
public class InitTest {
private static class Foo{
public <T> Foo(T t) {
System.out.println(t);
}
} public static void main(String[] args) {
Foo foo = new Foo(123);
Foo foo1 = new Foo("张三");
Foo foo2 = new<String> Foo("张三");
Foo foo3 = new <String> Foo(12); // <String>编译报错
}
}
Java8改进泛型推断判断
public class InferTest {
private static class A<T> {
public static <E> A<E> test1() {
System.out.println("test1");
return new A<>();
}
public static <E> A<E> test2(E e, A<E> a) {
System.out.println("test2");
return new A<>();
}
public T head() {
System.out.println("test3");
return null;
}
}
public static void main(String[] args) {
//下面两行代码相同
A<String> a1 = A.test1();
A<String> a2 = A.<String>test1();
// //下面两行代码相同
A.test2(56, A.test1());
// A.test2(56, A.<Integer>test1());
//下面代码如果用自动类型推断A.test1().head(),它会经过两次推断,最后就变成了不但能推断,因为我们自动类型推断,只能推断1次
String s = A.<String>test1().head();
}
}
擦除:
/**
* @ClassName ErasureTest
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/11.
*/
public class ErasureTest {
private static class A<T extends Number>{
private T size; public A(T size) {
this.size = size;
} public T getSize() {
return size;
}
} public static void main(String[] args) {
A<Integer> a = new A<>(33);
int size = a.getSize();
System.out.println(size);
A a1 = a;
//int size1 = a1.getSize(); // 这里size接收报错,a1实例化的时候没有显式的指定该泛型的类型,所以只能用顶级的Number去接收了
Number number = a1.getSize();
System.out.println(number);
}
}

java 数据类型:<泛型>在方法中和在构造器中的应用的更多相关文章
- java遍历泛型的方法
一.List遍历 Java中List遍历有三种方法来遍历泛型,主要为: 1.for循环遍历 2.iterator遍历 3.foreach遍历 package com.gmail.lsgjzhuwei; ...
- Java返回泛型的方法-实例
package com.frank.app; import java.io.UnsupportedEncodingException;import java.lang.reflect.Type;imp ...
- Java parseInt_使用此方法得到的原始数据类型的一个特定的字符串
Java parseInt解释加方法示例 使用此方法得到的原始数据类型的一个特定的字符串. parseXxx()是一个静态方法,可以有一个参数或两个 java parseInt ...
- JAVA 8 主要新特性 ----------------(五)Lambda方法引用与构造器引用
一.Lambda方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!) 方法引用: 使用操作符 “::” 将 ...
- java基础-泛型3
浏览以下内容前,请点击并阅读 声明 8 类型擦除 为实现泛型,java编译器进行如下操作进行类型擦除: 如果类型参数有限制则替换为限制的类型,如果没有则替换为Object类,变成普通的类,接口和方法. ...
- java基础-泛型1
浏览以下内容前,请点击并阅读 声明 泛型的使用能使类型名称作为类或者接口定义中的参数,就像一般的参数一样,使得定义的类型通用性更强. 泛型的优势: 编译具有严格的类型检查 java编译器对于泛型代码的 ...
- java基础-泛型举例详解
泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...
- 【一天一个基础系列】- java之泛型篇
简介 说起各种高级语言,不得不谈泛型,当我们在使用java集合的时候,会发现集合有个缺点:把一个对象"丢进"集合之后,集合就会"忘记"这个对象的数据类型,当再次 ...
- 【Java】泛型
文章目录 泛型 为什么要有泛型 在集合中使用泛型 如何自定义泛型结构 自定义泛型类.接口 泛型方法 泛型在继承方面的体现 通配符的使用 有限制条件的通配符的使用 泛型 为什么要有泛型 集合容器类在设计 ...
随机推荐
- Android连接远程数据库的避坑指南
Android连接远程数据库的避坑指南 今天用Android Studio连接数据库时候,写了个测试连接的按钮,然后连接的时候报错了,报错信息: 2021-09-07 22:45:20.433 705 ...
- RepeatModeler安装及使用
如果进行重复序列的预测,则使用RepeatModeler,可自身比对进行查找 安装 (1)下载地址:http://www.repeatmasker.org/RepeatModeler/ (2)Repe ...
- 【R】如何去掉数据框中包含非数值的行?
目录 1. 去掉指定列中包含NA/Inf/NaN的行 2. 去掉指定列中包含其他乱七八糟字符串的行 3. 去掉整个数据框中包含非数值的行 只包含NA.NaN和Inf的情况 针对其他字符情况 4. 总结 ...
- 嵌入式Linux利用ppp实现4G模块联网
https://blog.csdn.net/qq361294382/article/details/52136126 https://blog.csdn.net/qq361294382/article ...
- 12-Add Digits
寻找一个数的数根,用了暴力破解的方式,时间复杂度比较高 暂未想到O(1)的方式 Given a non-negative integer num, repeatedly add all its dig ...
- Scrapy-Splash的安装和使用
Scrapy-Splash是一个Scrapy中支持JavaScript渲染的工具. Scrapy-Splash的安装分为两部分.一个是Splash服务的安装,具体是通过Docker,安装之后,会启动一 ...
- GIFS服务的使用
1.安装Samba服务 登录192.168.200.20虚拟机,首先修改主机名,命令如下: [root@nfs-client ~]# hostnamectl set-hostname samba [r ...
- .NET Core基础篇之:集成Swagger文档与自定义Swagger UI
Swagger大家都不陌生,Swagger (OpenAPI) 是一个与编程语言无关的接口规范,用于描述项目中的 REST API.它的出现主要是节约了开发人员编写接口文档的时间,可以根据项目中的注释 ...
- abuse
abuse 近/反义词: ill-treat, maltreat, mistreat, misuse, prostitute, spoil; defame, disparage, malign, re ...
- day02 web主流框架
day02 web主流框架 今日内容概要 手写简易版本web框架 借助于wsgiref模块 动静态网页 jinja2模板语法 前端.web框架.数据库三种结合 Python主流web框架 django ...