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】泛型
文章目录 泛型 为什么要有泛型 在集合中使用泛型 如何自定义泛型结构 自定义泛型类.接口 泛型方法 泛型在继承方面的体现 通配符的使用 有限制条件的通配符的使用 泛型 为什么要有泛型 集合容器类在设计 ...
随机推荐
- 区分wsgi、uWSGI、uwsgi、php-fpm、CGI、FastCGI
在学习Python web开发时候,可能会遇到诸如uwsgi,wsgi等名词,下面通过梳理总结探究它们之间的关系. CGI CGI,(Common Gateway Interface)通用网关接口,是 ...
- Linux环境下R和R包安装及其管理
前言 R对windows使用很友好,对Linux来说充满了敌意.小数据可以在windows下交互操作,效果很好很棒.可是当我们要处理大数据,或者要在集群上搭建pipeline时,不得不面对在Linux ...
- R 语言实战-Part 5-2笔记
R 语言实战(第二版) part 5-2 技能拓展 ----------第21章创建包-------------------------- #包是一套函数.文档和数据的合集,以一种标准的格式保存 #1 ...
- MariaDB—配置允许(别的电脑IP)远程访问方式
首先配置允许访问的用户,采用授权的方式给用户权限 1 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRAN ...
- mysql—MySQL数据库中10位时间戳转换为标准时间后,如何对标准时间进行加减X天处理
在这篇的缘由:问题:"FROM_UNIXTIME(timeline,'%Y-%m')"的结果(2020-06)做月份增加1月或者减少1月的计算处理,想着直接在结果上+1但是,结果为 ...
- Go语言缺陷
我为什么放弃Go语言 目录(?)[+] 我为什么放弃Go语言 有好几次,当我想起来的时候,总是会问自己:我为什么要放弃Go语言?这个决定是正确的吗?是明智和理性的吗?其实我一直在认真思考这个问题. 开 ...
- 设置administrator账号密码
设置administrator账号密码: 打开:附件->运行 输入:lusrmgr.msc 在里面的用户里修改administrator密码
- centos 7的命令变化
1.service -> systemctl命令 2.ifconfig -> ip 命令 3.netstat -> ss命令 4.route -> ip route命令 5.t ...
- xmake v2.6.1 发布,使用 Lua5.4 运行时,Rust 和 C++ 混合编译支持
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...
- 搭建简单的SpringCloud项目二:服务层和消费层
GitHub:https://github.com/ownzyuan/test-cloud 前篇:搭建简单的SpringCloud项目一:注册中心和公共层 后篇:搭建简单的SpringCloud项目三 ...