背景:

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. .Net Core中使用ElasticSearch(二)

    .Net的ElasticSearch 有两个版本,Elasticsearch.Net(低级) 和 NEST(高级),推荐使用 NEST,低级版本的更灵活,水太深 把握不住.有个需要注意,使用的版本号必 ...

  2. Spring Cloud Gateway过滤器精确控制异常返回(实战,完全定制返回body)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 Spring Cloud Gateway应用 ...

  3. Codeforces 796E - Exam Cheating(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 当被数据结构搞自闭的 tzc 信心满满地点开一道 *2400 的 dp 题时-- 却发现自己不会做?! 这足以证明蒟蒻 dp 之菜/dk/ ...

  4. 流量限制器(Flux Limiter)

    内容翻译自Wikipedia Flux limiter 流量限制器(Flux limiters)应用在高精度格式中-这种数值方法用来求解科学与工程问题,特别是由偏微分方程(PDE's)描述的流体动力学 ...

  5. 使用FastqCount统计fastq文件基本信息?

    目录 1. FastqCount简介 2. 使用 3. 结果 1. FastqCount简介 快速实用小工具:FastqCount https://github.com/zhimenggan/Fast ...

  6. 【GS基础】植物基因组选择研究人员及数量遗传学发展一览

    目录 1.GS研究 2.数量遗传发展 GS应用主要在国外大型动物和种企,国内仍以学术为主.近期整理相关学术文献,了解到一些相关研究人员,记录下备忘查询,但不可能全面. 1.GS研究 Theo Meuw ...

  7. GATK4.1 call SNP

    GATK4.0 和之前的版本相比还是有较大的不同,更加趋于流程化. 软件安装 1 wget https://github.com/broadinstitute/gatk/releases/downlo ...

  8. Nginx+uwsgi+django+vue部署项目

    购买服务器 # 购买阿里云服务器 # 短期或是测试使用,创建 按量收费 服务器,可以随时删除,删除后不再计费,但要保证账户余额100元以上 连接服务器 1)账号 >: ssh root@39.9 ...

  9. centos下Spin Version 6.3.2及ispin安装(2014.9.17)

    centos下Spin Version 6.3.2及ispin安装(2014.9.17) 前言:windos下首先安装虚拟机,再安装linux系统(centos版) 一.本帖来源于官网http://s ...

  10. 标准非STL容器 : bitset

    1. 概念 什么是"标准非STL容器"?标准非STL容器是指"可以认为它们是容器,但是他们并不满足STL容器的所有要求".前文提到的容器适配器stack.que ...