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】泛型
文章目录 泛型 为什么要有泛型 在集合中使用泛型 如何自定义泛型结构 自定义泛型类.接口 泛型方法 泛型在继承方面的体现 通配符的使用 有限制条件的通配符的使用 泛型 为什么要有泛型 集合容器类在设计 ...
随机推荐
- vue进行代码排序
<template> <div> <div> <h3>排序 </h3> <button @click="orderByAge ...
- Python实战:截图识别文字,过万使用量版本!(附源码!!)
前人栽树后人乘凉,以不造轮子为由 使用百度的图片识字功能,实现了一个上万次使用量的脚本. 系统:win10 Python版本:python3.8.6 pycharm版本:pycharm 2021.1. ...
- Git的基础入门
Git --everything-is-local 查阅文档 Git是一个免费的开源 分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容. Git易于学习, 占地面积小,具有闪电般的快速 ...
- CF1477A Nezzar and Board
考虑 \(2x - y\) 我们改为 \(x + (x - y)\) 是一个更好的形式. 我们可以表示一个数为\(x_i + \sum_{j,k}(x_j - x_k) = K\) 我们考虑移到 \( ...
- UOJ 75 - 【UR #6】智商锁(矩阵树定理+随机+meet-in-the-middle)
题面传送门 一道很神的矩阵树定理+乱搞的题 %%%%%%%%%%%%%%% vfk yyds u1s1 这种题目我是根本想不出来/kk,大概也就 jgh 这样的随机化带师才能想到出来吧 首先看到生成树 ...
- 洛谷 P3721 - [AH2017/HNOI2017]单旋(LCT)
洛谷题面传送门 终于调出来这道题了,写篇题解( 首先碰到这样的题我们肯定要考虑每种操作会对树的形态产生怎样的影响: 插入操作:对于 BST 有一个性质是,当你插入一个节点时,其在 BST 上的父亲肯定 ...
- O(1)判断两点之间是否有边
O(1)判断两点之间是否有边 问题描述 给定一张 \(n\) 个点,\(m\) 条边的有向图. 多次询问,要求每次 \(\mathcal{O}(1)\) 判断两点之间是否有边(你可以忽略输入.输出等问 ...
- 【Meta】16s rRNA和16s rDNA的区别
在文章或宣传稿中经常看到两者滥用,实际上是不同的. 首先是各个字母的含义: 16S中的"S"是一个沉降系数,亦即反映生物大分子在离心场中向下沉降速度的一个指标,值越高,说明分子越大 ...
- 毕业设计之dns搭建:
[apps@dns_sever ~]$ sudo yum install -y bind [apps@dns_sever ~]$ sudo vim /etc/named.conf // // name ...
- 安卓手机添加系统证书方法(HTTPS抓包)
目录 1. 导出证书(以Charles为例) 2. 安卓证书储存格式 3. 将导出的证书计算hash值 4. 生成系统系统预设格式证书文件 5. 上传证书 安卓7.0以后,安卓不信任用户安装的证书,所 ...