背景:

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();
}
}

擦除:

在严格的泛型代码里,带泛型声明的类总应该带着类型参数。
但为了与老的 Java 代码保持一致,也允许在使用带泛型声明的类时不指定实际的类型。如果没有为这个泛型类指定实际的类型,此时被称为 raw type (原始类型),默认是声明该泛型形参时指定的第一个上限类型。
/**
* @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 数据类型:<泛型>在方法中和在构造器中的应用的更多相关文章

  1. java遍历泛型的方法

    一.List遍历 Java中List遍历有三种方法来遍历泛型,主要为: 1.for循环遍历 2.iterator遍历 3.foreach遍历 package com.gmail.lsgjzhuwei; ...

  2. Java返回泛型的方法-实例

    package com.frank.app; import java.io.UnsupportedEncodingException;import java.lang.reflect.Type;imp ...

  3. Java parseInt_使用此方法得到的原始数据类型的一个特定的字符串

    Java parseInt解释加方法示例     使用此方法得到的原始数据类型的一个特定的字符串. parseXxx()是一个静态方法,可以有一个参数或两个         java parseInt ...

  4. JAVA 8 主要新特性 ----------------(五)Lambda方法引用与构造器引用

    一.Lambda方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!) 方法引用: 使用操作符 “::” 将 ...

  5. java基础-泛型3

    浏览以下内容前,请点击并阅读 声明 8 类型擦除 为实现泛型,java编译器进行如下操作进行类型擦除: 如果类型参数有限制则替换为限制的类型,如果没有则替换为Object类,变成普通的类,接口和方法. ...

  6. java基础-泛型1

    浏览以下内容前,请点击并阅读 声明 泛型的使用能使类型名称作为类或者接口定义中的参数,就像一般的参数一样,使得定义的类型通用性更强. 泛型的优势: 编译具有严格的类型检查 java编译器对于泛型代码的 ...

  7. java基础-泛型举例详解

    泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...

  8. 【一天一个基础系列】- java之泛型篇

    简介 说起各种高级语言,不得不谈泛型,当我们在使用java集合的时候,会发现集合有个缺点:把一个对象"丢进"集合之后,集合就会"忘记"这个对象的数据类型,当再次 ...

  9. 【Java】泛型

    文章目录 泛型 为什么要有泛型 在集合中使用泛型 如何自定义泛型结构 自定义泛型类.接口 泛型方法 泛型在继承方面的体现 通配符的使用 有限制条件的通配符的使用 泛型 为什么要有泛型 集合容器类在设计 ...

随机推荐

  1. Kubernetes Deployment 最佳实践

    零.示例 首先给出一个 Deployment+HPA+ PodDisruptionBudget 的完整 demo,后面再详细介绍其中的每一个部分: apiVersion: apps/v1 kind: ...

  2. 记一次使用 SelectMany 的经历

    最近在改造一个功能时为了减少循环的层数,于是想着将List列表映射为一个能直接使用颗粒大小的List列表,这样一层循环就可以解决问题.     public class ConflictWordIte ...

  3. Codeforces 1137F - Matches Are Not a Child's Play(LCT)

    Codeforces 题面传送门 & 洛谷题面传送门 考虑将一个点 \(x\) 的编号变为当前所有点编号最大值 \(+1\) 会对每个点的删除时间产生怎么样的影响.由于编号最大的点肯定是最后一 ...

  4. HDU 6984 - Tree Planting(数据分治+状压 dp)

    题面传送门 傻逼卡常屑题/bs/bs,大概现场过得人比较少的原因就是它比较卡常罢(Fog 首先对于这样的题我们很难直接维护,不过注意到这个 \(n=300\) 给得很灵性,\(k\) 比较小和 \(k ...

  5. R之dplyr::select/mutate函数扩展

    select函数 dplyr包select函数用的很多,不过我们一般也是通过正反选列名或数字来选择列. 常见用法如: select(iris,c(1,3)) select(iris,1,3) #同上 ...

  6. Scrapy-Redis的安装和使用

    Scrapy-Redis是Scrapy的分布式扩展模块,有了它,我们就可以方便地实现Scrapy分布式爬虫的搭建.GitHub:https://github.com/rmax/scrapy-redis ...

  7. jquery chosen onchange 值改变时触发方法

    jquery chosen onchange 值改变时触发方法如下:$(".chzn-select").chosen().on("change", functi ...

  8. Linux 软件安装位置选择指南

    Linux 软件安装   Linux 下安装软件不像 Windows 下安装这么简单,Windows 下会自动选择合适安装路径,而 Linux 下安装路径大部分完全由自己决定,我可以将软件安装到任意可 ...

  9. [云原生]Docker - 安装&卸载

    目录 系统要求 卸载旧版本 安装Docker 方法一:通过repo安装 设置Repository 安装Docker Engine 升级Docker Engine 方法二:通过package安装 方法三 ...

  10. navicate连接Mysql5.7时,显示Access denied for user 'root'@'localhost' (using password: YES) 错误

    最近新装了Mysql5.7,按如下设置好了允许远程连接    (1)找到mysql配置文件并修改 sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf 将bind-ad ...