java 方法泛型入参T和String的重载关系详解

目录
  • 方法泛型入参T和String的重载关系
    • 重载的基本知识不在这里讨论了
  • 重载遇到泛型的问题
    • 反复求证,得出以下结论

方法泛型入参T和String的重载关系

重载的基本知识不在这里讨论了

重载的一个关键理论,如果方法名相同,参数个数、父类型、位置也相同,则调用更加特殊化一个方法。

多余的没写,大家可以运行一下下面的代码,然后理解一下就ok了。

public class TestMain { 
    public static void main(String[] args) {
        TestMain t = new TestMain();
        t.func("message");
        t.func(new String("message"));
        t.func(new Object());
    }
 
    protected <T> void func(T data) {
        System.out.println("fun1" + data);
    }
 
    protected void func(String data) {
        System.out.println("fun2" + data);
    } 
}

由于string和T相比较,带有String data入参的方法更加特殊化,所以当传入String参数的时候,会调用第2个func。

网上还有关于null入参的讨论,我理解是由于null入参两个方法都可以,所以会选择更加特殊化的方法,也就是第二个func。

这里可以试一下,定义一个Object入参的方法,编译器会直接说与T data入参的方法歧义。

(T是一个泛型,没有具体说明类型,这里类似于Object类型)

重载遇到泛型的问题

今天被问到一个有意思的问题,大家都知道重载的概念吧:一个类中定义同名的方法,参数表不同(参数类型,或者参数个数不通);

但是,如果是下面这个两个方法呢

public static int fn(List<Integer> index) { 
   return 1; 
} 
public static String  fn(List<String> str) {    
   return "str"; 
} 

同名的两个方法,参数表中用到了集合,参数表里的泛型不一样,那么到底这样能不能编译通过呢?

反复求证,得出以下结论

使用Sun JDK的Javac来进行编译会通过,而其他编译器可能会拒绝编译这段代码

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 带大家认识Java语法之泛型与通配符

    目录 ️前面的话️ 1.泛型 1.1泛型的用法 1.1.1泛型的概念 1.1.2泛型类 1.1.3类型推导 1.2裸类型 1.3擦除机制 1.3.1关于泛型数组 1.3.2泛型的编译与擦除 1.4泛型的上界 1.4.1泛型的上界 1.4.2特殊的泛型上界 1.4.3泛型方法 1.4.4类型推导 2.通配符 2.1通配符的概念 2.2通配符的上界 2.3通配符的下界 总结 ️前面的话️ 本篇文章带大家认识Java语法——泛型与通配符,泛型和通配符是一个非常抽象的概念,简单来说,两者都可以将类型作为

  • 这个Java泛型不太正经

    目录 一.前言 二.泛型 三.泛型定义的格式: 什么是引用类型? 泛型的好处是: 四.泛型类 五.泛型方法 六.泛型接口 七.类型通配符 总结 一.前言 泛型在java中有很重要的地位,在实际开发中用处也很大. 二.泛型 泛型:是jdk5中引入的特性,他提供编译是类型是类型的安全检测机制,这个机制允许在编译时检测到非法的类型,它的本质是参数化类型,也就是所操作的数据类型不变指定为一个参数 将原来具体的类型参数化,然后再使用/调用的时候传入具体的参数 泛型的类型: ①:泛型类 ②:泛型方法 ③:泛

  • Java中泛型学习之细节篇

    目录 简介 正文 什么是类型参数 为啥要有泛型 泛型的演变史 类型擦除 泛型的应用场景 通配符限定 动态类型安全检查 总结 简介 泛型的作用就是把类型参数化,也就是我们常说的类型参数 平时我们接触的普通方法的参数,比如public void fun(String s):参数的类型是String,是固定的 现在泛型的作用就是再将String定义为可变的参数,即定义一个类型参数T,比如public static <T> void fun(T t);这时参数的类型就是T的类型,是不固定的 从上面的S

  • 史上最全图文讲解Java泛型

    目录 前言 一:泛型本质 二:为什么使用泛型 三:如何使用泛型 1.泛型类 2.泛型接口 3.泛型方法 四:泛型通配符 五:泛型中KTVE的含义 六:泛型的实现原理 七:关于泛型数组要提一下 八:最后 前言 泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它. 毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课. 一:泛型本质 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允

  • 详细全面解析Java泛型

    1.概述 作为一个面向对象的编程语言,Java可以通过实现一些类,作为我们各种需求的一个模板,方便我们的使用.但有时候,这个类的范围可能比我们想要的范围要大,我们只想限定于满足类的某些对象,那这样的情况下,泛型的概念就被提出来了(非官方解释,方便理解). 举个例子:比如我们我们生活中的车,它可以作为一个类,但是车其实又有很多种,包括货车,轿车,大巴车等等,而其中的轿车外观差不多,但是又属于不同的品牌,这些品牌有很多不一样的地方,这里我们可以把轿车的品牌看作是泛型(类似于标签) 通过上面的解释,泛

  • Java 泛型详解与范例

    目录 一.泛型的使用 二.泛型类的定义-类型边界 三.类型擦除 四.泛型类的使用-通配符 五.泛型方法 六.泛型的限制 一.泛型的使用 前面我们学集合的时候,简单的说过泛型的使用.如下: ArrayList<Integer> list = new ArrayList<>(); Queue<Integer> queue = new LinkedList<>(); 那么使用是这样的简单,该注意什么? 尖括号里的类型,只能写引用类型 基础数据类型的话,就需要写相应

  • Java泛型之类型擦除实例详解

    目录 前言 泛型是什么? 泛型的定义和使用 泛型类 泛型方法 泛型类与泛型方法的共存现象 泛型接口 通配符 ? 无限定通配符 <?> <? extends T> 类型擦除 类型擦除带来的局限性 泛型中值得注意的地方 Java 不能创建具体类型的泛型数组 泛型,并不神奇 总结 前言 泛型,一个孤独的守门者. 大家可能会有疑问,我为什么叫做泛型是一个守门者.这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇.泛型是 Java 中一个很小巧的概念,但同时

  • Java十分钟精通泛型的使用与原理

    什么是泛型? 简而言之:<>泛型就是用来约束类.方法.属性上的数据类型,比如 List<Integer> list = new ArrayList<Integer>(); new ArrayList这个集合的元素只能添加Integer类型. 为什么需要泛型? Java推出泛型之前,程序员可以构建一个Object类型的集合,该集合能够存储任何的数据类型,而在使用该 集合的时候,需要程序员明确知道每个元素的具体的类型并向下转型,否则容易引发ClassCastExceptio

  • java 方法泛型入参T和String的重载关系详解

    目录 方法泛型入参T和String的重载关系 重载的基本知识不在这里讨论了 重载遇到泛型的问题 反复求证,得出以下结论 方法泛型入参T和String的重载关系 重载的基本知识不在这里讨论了 重载的一个关键理论,如果方法名相同,参数个数.父类型.位置也相同,则调用更加特殊化一个方法. 多余的没写,大家可以运行一下下面的代码,然后理解一下就ok了. public class TestMain {      public static void main(String[] args) {       

  • java 方法重写与权限修饰符以及多态和抽象类详解概念和用法

    1.方法重写 子类写和父类一样的方法定义 public void call(){ System.out.println("输出文字"); //父类的方法 } public void call(){ System.out.println("helloworld"); } //子类的方法 重写父类方法时,容易写错名字怎么办? 加个@Override 注解 如果报错,说明重写父类方法时,写错了 @Override: @Override public void call()

  • Java整型数与网络字节序byte[]数组转换关系详解

    本文实例讲述了Java整型数与网络字节序byte[]数组转换关系.分享给大家供大家参考,具体如下: 工作项目需要在java和c/c++之间进行socket通信,socket通信是以字节流或者字节包进行的,socket发送方须将数据转换为字节流或者字节包,而接收方则将字节流和字节包再转换回相应的数据类型.如果发送方和接收方都是同种语言,则一般只涉及到字节序的调整.而对于java和c/c++的通信,则情况就要复杂一些,主要是因为java中没有unsigned类型,并且java和c在某些数据类型上的长

  • 使用Spring Boot AOP处理方法的入参和返回值

    前言 IOC和AOP是Spring 中最重要的两个模块.这里练习一下如何使用Spring Boot AOP处理方法的入参和返回值. Spring AOP的简单介绍: AOP(Aspect-Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP能够将那些与业务⽆关,却为业务模块所共同调⽤的逻辑或责任(例如事务处理.⽇志管理.权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于提高系统的可拓展性和可维护性.

  • Java String 和StringBuffer的详解及区别

    Java String 和StringBuffer的详解及区别 Java平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含 多个字符的字符数据.String类表示内容不可改变的字符串.而StringBuffer类表示内 容可以被修改的字符串. 当你知道字符数据要改变的时候你就可以使用StringBuffer.典型地,你可以使用StringBuffers来动态构造 字符数据.另外,String实现了equals方法,new String("abc"

  • Java String 拼接字符串原理详解

    首先来一道思考题: String str1 = "111111"; String str2 = "222222"; String str = str1 + str2; System.out.println(str); 很明确,上述代码输出的结果是:"111111222222",但是它工作原理是怎样的呢? 由于字符串拼接太常用了,java才支持可以直接用+号对两个字符串进行拼接.**其真正实现的原理是中间通过建立临时的StringBuilder对象

  • Java中String类常用方法使用详解

    目录 一.length() 二.equals 三.charAt() 四.indexOf() 五.trim() 六.compareTo() 七.toLowerCase() 八.toUpperCase() 九.replace() 十.substring(int beginIndex) 十一.substring(int beginIndex, int endIndex) 总结 一.length() 返回此字符串的长度 public static void main4(String[] args) {

  • Java中String类常用方法总结详解

    目录 一. String对象的比较 1. ==比较是否引用同一个对象 2. boolean equals(Object anObject) 3. int compareTo(String s) 4. int compareToIgnoreCase(String str) 二. 字符串查找 三. 转化 1. 数值和字符串转化 2. 大小写转化 3. 字符串和数组的转换 4. 格式化 四. 字符串替换 五. 字符串拆分 六. 字符串截取 七. 其他操作方法 1. String trim() 2. b

  • java 流操作对文件的分割和合并的实例详解

    java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代码: package com.dufy.file; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.SequenceInputStream; import java.ut

  • Java中lombok的@Builder注解的解析与简单使用详解

    Lombok中@Builder用法 1.建造者模式简介:Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 2.注解类Builder.java注释: * The builder annotation creates a so-called 'builder' aspect to the class that is annotated or the class  * that contains a mem

随机推荐