精华内容
下载资源
问答
  • java泛型方法
    千次阅读
    2021-09-08 17:38:52

    关于Java中的泛型接口和泛型类这里不做赘述,主要说下泛型方法。

    泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型 。、

    下面是一个泛型方法的基本格式:

    // <T>表明该方法是一个泛型方法,此时才可以在方法中使用泛型类型T
    public <T> T getObject(Class<T> tClass)throws InstantiationException ,
      IllegalAccessException{
            T instance = tClass.newInstance();
            return instance;
    }
    
    什么样的方法才是泛型方法:
    public abstract class DingTalkMessageBuilderFactory<Builder> {
        
        /**
         * 这个方法虽然使用了泛型,但是这并不是一个泛型方法。这只是类中一个普通的成员方法
         * 只不过他的返回值是在声明泛型类已经声明过的泛型。所以在这个方法中才可以继续使用Builder这个泛型。
         */
        public abstract Builder createBuilder();
        
        /**
         * 这也不是一个泛型方法,这就是一个普通的方法,DingTalkMessageBuilderFactory<Number>这个泛型类做形参而已。
         */
        public abstract void createBuilder(DingTalkMessageBuilderFactory<Number> obj);
    
        /**
         * 这是一个真正的泛型方法,只不过是在泛型类中声明了一个泛型方法,使用泛型Builder,
         * 注意这个Builder是一种全新的类型,与泛型类中声明的Builder不是同一种类型。
         */
        public abstract <Builder> Builder createBuilder();
    
    }
    
    泛型方法可以无参吗:
    public class DingTalkMessageBuilderFactory {
        
        /**
         * 这是一个无参的泛型方法,根据泛型方法的基本格式,这是一个无用的方法
         * 首先方法内必须强转,这是第一层不安全,其次,即使这样能让编译通过
         * 如果运行时客户端使用接口对象不是 DingTalkTextBuilder 类型也会报错
         */
        public <Builder> Builder createBuilder() {
        	return (Builder)new DingTalkTextBuilder();
        };
    
    }
    
    什么时候用泛型类:

    Think in java 里有一句使用泛型方法的基本指导原则:
    无论何时,能用泛型方法就尽量不要使用泛型类,那什么时候不能用泛型方法解决呢,上面就是一个很好的例子,方法无法接受任何参数,但是返回值要泛型,这种情况就要使用泛型类;
    另外对于一个static的方法而言,static方法无法访问泛型类型的参数。所以如果static方法要使用泛型能力,就必须使其成为泛型方法。

    更多相关内容
  • Java泛型方法

    2021-12-02 11:04:03
    Java泛型方法 在学习Java泛型方法之前,我希望你们针对于Java泛型类有一定的了解并且可以熟练的使用。若了解并不是很详细。可以观看我写的另一篇文章 (也是我写的) Java泛型类 来了解一下。 呢么我们速度过一下...

    Java泛型方法


    在学习Java泛型方法之前,我希望你们针对于Java泛型类有一定的了解并且可以熟练的使用。若了解并不是很详细。可以观看我写的另一篇文章 (也是我写的) Java泛型类 来了解一下。


    呢么我们速度过一下泛型方法。其实泛型方法并不难理解。 我们直接上代码来演示一下。

    首先我们有两个Java类,一个是存在泛型方法的类,一个是Test测试类。名称随便给都可以。

    public class Param {
    
        public static <T> T param(T t) {
            return t;
        }
        
    }
    
    public class Test {
    
        public static void main(String[] args) {
    
            String aaa = Param.param("aaa");
    
            Integer param = Param.param(1);
    
            Boolean param1 = Param.param(true);
    
        }
    
    

    我们观看以上代码,不难发现。我们并没有对Param类里的param方法进行重载写法。但是他却可以传进去不同的类类型(数据类型)。就是因为我们使用了泛型方法的原因。

    现在我们来拆分掉这个方法,逐步的解释一下它的结构体。

    public static <T> T param(T t) {
            return t;
    }
    

    public 并不用过多解释,static,静态方法,为了可以通过类名称直接访问方法。重点是这几行代码

    <T> T param(T t) {
            return t;
    }
    

    如果我们学过泛型类。呢么我们就应该知道 <T> 可以理解成泛型标识的意思。呢么我们抛开泛型标识。 正常来写我们的方法,public static 后面应该写什么。 是不是返回值类型,如果没有返回值类型就写 void。 没错吧。 呢么我们的 字母 T。 就对应了返回值类型。我们前面传入什么数据类型,呢么他就返回什么数据类型。 继续往后走。 param() 是方法名称,对应的参数 是T类型。也就是调用我这个方法的时候,传入什么。我就是什么数据类型。最后返回 t。

    图解。

    在这里插入图片描述

    需要注意的一点是。如果我们的类也是泛型类。呢么他们的泛型标识并不冲突。依然是我们代码直接带入说明。

    现在我们需要创建一个泛型类 Param<T> 并且添加一个属性,类型也是T 。写上对应的Getter和Setter方法。写上有参构造。

    public class Param<T> {
    
        private T param;
    
        public Param(T param) {
            this.param = param;
        }
    
        public <T> T param(T t) {
            return t;
        }
    
        public T getParam() {
            return param;
        }
    
        public void setParam(T param) {
            this.param = param;
        }
    }
    
    

    呢么可能就有朋友注意到了,我们方法的泛型标识和类的泛型标识一样, 都是通过<T> 来标识的,在这里我就先告诉大家,这两个完全不冲突。谁的就是谁的。我们做个测试。

    public class Test {
    
       public static void main(String[] args) {
    
           Param<String > param = new Param<>("我是一个String类型的字符串");
    
           System.out.println("type: " + param.getParam().getClass().getSimpleName() +  " value:" + param.getParam());
    
           System.out.println("---------------------------------------");
    
           Integer param1 = param.param(1123);
    
           System.out.println(param1.getClass().getSimpleName());
    
       }
    
    }
    

    我们在测试类创建了一个Param对象并且进行了实例化。可以很清楚的看到,我们类的泛型传递的是一个String的类类型。然后我们并没有新建对象,而是继续用实例化出来的对象,调用了我们的param方法。传递进去一个Integer类型。发现并没有报错。我们通过 getClass().getSimpleName() 来获取一下他们的数据类型。得到以下结果。

    type: String value:我是一个String类型的字符串
    ---------------------------------------
    Integer
    Process finished with exit code 0

    可以很清楚的看到。类的泛型类型,和方法的泛型类型,完全不相干,即便是他们 泛型标识符相同 <T> 也不影响我们的正常使用。

    展开全文
  • Java泛型方法解惑

    2022-04-07 15:05:45
    顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/公用时传入具体的类型这种参数类型可以用在类、方法和接口中,分别被称为泛型、泛型方法、泛型接口。 为什么要使用泛型? 一言以蔽之,编译时检测到非法...

    概述

    什么是泛型?

    泛型,是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
    提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?
    顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/公用时传入具体的类型这种参数类型可以用在类、方法和接口中,分别被称为泛型、泛型方法、泛型接口。

    为什么要使用泛型?

    一言以蔽之,编译时检测到非法的类型
    场景:给你一个ArrayList,让你求该list中所有元素的和。(注意,该list原则上是要存int类型的数的)
    没有泛型之前:

      ArrayList arrayList = new ArrayList();
      arrayList.add(1);
      arrayList.add(2);
      arrayList.add(3);
      //非法输入,但不会报错
      arrayList.add("3");
    

    求list的元素和的话我会遍历该list,然后依次相加。
    发现这个list最后存入了一个String类型的值,当你遍历相加肯定是得不到正确答案的!
    使用泛型之后:

    ArrayList<Integer> arrayList = new ArrayList<>();
    arrayList.add(1);
    arrayList.add(2);
    arrayList.add(3);
    //非法输入,直接报错
    arrayList.add("3");
    

    可以看出在创建list时指定了存储的类Integer,因此在后续添加元素时添加了String就直接报错了,因此求和操作就不会受到影响。

    泛型种类

    泛型类

    基本语法:
    在这里插入图片描述
    示例:

    public class Generic<T> {
    	//成员属性
        T value;
        public Generic(T value) {
            this.value = value;
        }
        //注意这不是泛型方法
        T getValue() {
            return this.value;
        }
    }
    
    

    注意点:

    1. 使用时才指定类型,不能是基本数据类型(泛型底层是通过Object实现的,基本类型不继承Object)
    2. 若不指定类型,则默认为Object
    3. 指定不同类型后他们实际上依然是该泛型类(即泛型只在编译期间有效,就是是所谓的泛型擦除

    扩展:
    对泛型类进行继承时应该注意以下两点:
    在这里插入图片描述

    泛型接口

    泛型接口跟泛型类的使用基本上是一样的,在此不再赘述,但实现接口时依然要牢记以下两点:
    在这里插入图片描述

    泛型方法

    泛型类和泛型接口都很容易理解,所以本文的重点是泛型方法,相信大家在学习泛型方法过程中会有几个疑问:

    1. 为啥使用到泛型成员的方法不是泛型方法
    2. 泛型方法有啥用

    先抛出问题,相信看完接下来的案例之后就会恍然大悟。
    语法:
    在这里插入图片描述
    可以发现泛型方法的申明要在返回值前加<>,也就是说只有加了这个尖括号的方法才是泛型方法,而上面的泛型类中的示例就不是泛型方法。
    解惑:
    先来看为什么要有泛型方法:
    假如我们定义一个方法,用于返回给定任意类型的参数的String(虽然这是没有意义的),
    既然要具有通用性,那么我们会想到用泛型来解决,因此定义了以下的方法:
    在这里插入图片描述
    其实我们定义了一个泛型类,然后里面的方法使用到了泛型,但是事与愿违,这个方法并不能返回任何类型参数的String,因为这个方法不是泛型方法,在创建泛型类时就把它指定成了Integer类型,当我们传入Long类型的参数时编译器就会报错。
    接下来我们使用真正的泛型方法:
    在这里插入图片描述
    可以发现不再报错了,但是前面也说了这个方法实际上是没有意义的,因此下面我们定义一个有意义的方法:

    给定类的字节码对象,然后返回一个该类的实列

    我们会考虑:

    1. 给定类字节码创建对象肯定就调用字节码对象的newInstance方法
    2. 既然要通用,那么返回值是不确定的,那直接用Object没问题吧

    于是就得出了以下代码:(请忽略类上的< T >)
    在这里插入图片描述
    可以发现能够正常运行,但是细心的你一定会发现调用方法后必须要强转类型!

    所以就要使用泛型方法了:(请忽略类上的< T >)
    在这里插入图片描述
    至此关于泛型方法的一些疑惑相信都已经消失了吧!

    注意点:

    1. 泛型方法中的泛型和泛型类的泛型是独立
    2. 如果static方法要使用泛型能力,就必须使其成为泛型方法(因为泛型类需要指定类型才能确定)
    展开全文
  • java泛型方法的定义和使用

    千次阅读 多人点赞 2021-11-13 14:50:27
    ???? 周周有福利,周周有惊喜 哪吒社区 - 风火轮计划 ???? Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强) ... Java经典面试题大全:10万字208道Java经典面试题...Java泛型是J2 SE1.5中引入

    🍅 周周有福利,周周有惊喜 哪吒社区 - 风火轮计划
    🍅 Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强)
    🍅 Java经典面试题大全:10万字208道Java经典面试题总结(附答案)
    🍅 简介:Java领域优质创作者🏆、CSDN哪吒公众号作者✌ 、Java架构师奋斗者💪
    🍅 扫描主页左侧二维码,加入群聊,一起学习、一起进步
    🍅 欢迎点赞 👍 收藏 ⭐留言 📝

    一、基本介绍

    Java泛型是J2 SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

    二、泛型的优点

    1、类型安全

    泛型的主要目的是提高Java程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在非常高的层次上验证类型假设。没有泛型,这些假设就只能存在于系统开发人员的头脑中。

    通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误就可以在编译时被捕获了,而不是在运行时当作ClassCastException展示出来。将类型检查从运行时挪到编译时有助于Java开发人员更早、更容易地找到错误,并可提高程序的可靠性。

    2、消除强制类型转换

    泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。尽管减少强制类型转换可以提高使用泛型类的代码的累赞程度,但是声明泛型变量时却会带来相应的累赞程度。在简单的程序中使用一次泛型变量不会降低代码累赞程度。但是对于多次使用泛型变量的大型程序来说,则可以累积起来降低累赞程度。所以泛型消除了强制类型转换之后,会使得代码加清晰和筒洁。

    3、更高的效率

    在非泛型编程中,将筒单类型作为Object传递时会引起Boxing(装箱)和Unboxing(拆箱)操作,这两个过程都是具有很大开销的。引入泛型后,就不必进行Boxing和Unboxing操作了,所以运行效率相对较高,特别在对集合操作非常频繁的系统中,这个特点带来的性能提升更加明显。

    4、潜在的性能收益

    泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,Java系统开发人员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的JVM的优化带来可能。

    四、常见泛型字母含义

    格式: 类名<字母列表>

    T Type表示类型

    K V 分辨表示键值对中的key value

    E 代表Element

    ?表示不确定的类型

    五、使用泛型时的注意事项

    1、在定义一个泛型类时,在“<>”之间定义形式类型参数,例如:“class TestGen<K,V>”,其中“K”,“V”不代表值,而是表示类型。

    2、实例化泛型对象时,一定要在类名后面指定类型参数的值(类型),一共要有两次书写。

    3、使用泛型时,泛型类型必须为引用数据类型,不能为基本数据类型,Java中的普通方法,构造方法,静态方法中都可以使用泛型,方法使用泛型之前必须先对泛型进行声明,可以使用任意字母,一般都要大写。

    4、不可以定义泛型数组。

    5、在static方法中不可以使用泛型,泛型变量也不可以用static关键字来修饰。

    6、根据同一个泛型类衍生出来的多个类之间没有任何关系,不可以互相赋值。

    7、泛型只在编译器有效

    六、泛型的使用

    泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法

    1、泛型类

    package javase.genericity;
     
    //此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
    //在实例化泛型类时,必须指定T的具体类型
    public class Generic<T> {
        //key这个成员变量的类型为T,T的类型由外部指定
        private T key;
        //泛型构造方法形参key的类型也为T,T的类型由外部指定
        public Generic(T key){
            this.key = key;
        }
        //泛型方法getKey的返回值类型为T,T的类型由外部指定
        public T getKey(){
            return key;
        }
     
        public static void main(String[] args) {
            //泛型的类型参数只能是类类型(包括自定义类),不能是简单类型
            //传入的实参类型需与泛型的类型参数类型相同,即为Integer.
            Generic<Integer> genericInteger = new Generic<Integer>(123456);
            //传入的实参类型需与泛型的类型参数类型相同,即为String.
            Generic<String> genericString = new Generic<String>("江疏影");
            System.out.println("泛型测试,key is "+genericInteger.getKey());
            System.out.println("泛型测试,key is "+genericString.getKey());
        }
    }
    

    泛型参数就是随便传的意思!

     
    Generic generic = new Generic("111111");
    Generic generic1 = new Generic(4444);
    Generic generic2 = new Generic(55.55);
    Generic generic3 = new Generic(false);
    




    更多用法详见:【Java基础知识 11】java泛型方法的定义和使用

    上一篇:Java零基础入门 12:Java中的Object类

    下一篇:Java零基础入门 14:java枚举类

    在这里插入图片描述

    添加微信,备注1024,赠送Java学习路线思维导图
    展开全文
  • 下面小编就为大家带来一篇浅谈Java泛型让声明方法返回子类型的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 主要介绍了Java泛型定义与用法,结合实例形式较为详细的分析了Java中泛型的概念、原理、定义、使用方法及相关操作注意事项,需要的朋友可以参考下
  • java泛型方法动态返回值

    千次阅读 2021-11-07 09:55:01
    单独使用调用泛型方法<T> class SingleLinkList { public <T>T getadd(T t) { return t; } } public class SingleLinkListTest { public static void sssmain(String[] args) { ...
  • 方法返回值前的的左右是告诉编译器,当前的方法的值传入类型可以和类初始化的泛型类不同,也就是该方法泛型类可以自定义,不需要跟类初始化的泛型类相同
  • Java 泛型方法的调用

    千次阅读 2020-09-09 21:28:01
    * 测试泛型方法 */ public class TestFX { /** * 返回第一个元素 * @param a * @param <T> 声明一个类型 * @return */ public static <T> T getFirst(T... a) { return a[0]; } public ...
  • 主要介绍了Java泛型实例化的方法,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
  • java泛型 方法返回值带有泛型 <T>

    千次阅读 2021-09-01 16:46:13
    的左右是告诉编译器,当前的方法的值传入类型可以和类初始化的泛型类不同,也就是该方法泛型类可以自定义,不需要跟类初始化的泛型类相同。 转自:https://blog.csdn.net/huyashangding/article/details/90265492...
  • 主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • java泛型方法参数传递

    千次阅读 2021-01-27 01:38:10
    Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始...
  • Java 泛型方法详解

    2019-03-04 21:05:39
    1.什么是泛型方法 泛型方法,是在调用方法的时候指明泛型的具体类型。 /** * 泛型方法的基本介绍 * @param tClass 传入的泛型实参 * @return T 返回值为T类型 * 说明: * 1)public 与 返回值中间&lt;T&...
  • Java泛型方法的定义

    万次阅读 多人点赞 2019-06-22 19:30:14
    泛型方法主要用于容器类,Java中任何方法,包括静态的(注意,泛型类不允许在静态环境中使用)和非静态的,均可以用泛型来定义,而且和所在类是否是泛型没有关系。 下面是泛型方法的定义 [public] [static] <T&...
  • Java 泛型方法/接口、泛型限定

    万次阅读 多人点赞 2019-03-30 21:40:50
    文章目录 一、为什么要定义泛型方法 1、从泛型类到泛型方法的演变过程 2、定义泛型方法的好处 二、创建一个泛型方法格式 常用的形式 三、泛型接口 1、格式 2、例子 四、类型通配符(泛型的高级应用) 1、什么是通配符 ...
  • 目录一、基本概述二、特性三、泛型的使用3.1 泛型类3.2 泛型接口3.3 泛型通配符3.4 泛型方法(1)泛型方法的基本用法(2)类中的泛型方法(3)泛型方法与可变参数(4)静态方法与泛型(5)泛型方法总结四、泛型数组 ...
  • JAVA泛型-泛型方法的定义和使用

    千次阅读 2021-10-23 19:56:34
    1.泛型方法的定义和语法 1.1 定义 泛型方法 是在调用方法的时候指明泛型的具体类型。 【泛型方法 能够使方法独立于类的处理指定的类型。】 1.2 语法 修饰符 <T,E,…> 返回值类型 方法名(形参列表){ 。。...
  • java泛型 方法返回值带有泛型

    千次阅读 2020-09-11 15:29:25
    方法返回值前的<T>的左右是告诉编译器,当前的方法的值传入类型可以和类初始化的泛型类不同,也就是该方法泛型类可以自定义,不需要跟类初始化的泛型类相同
  • 本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1. 概述泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”。一...
  • java 泛型方法 返回泛型结果

    千次阅读 2019-03-26 09:58:22
    https://blog.csdn.net/dekiven1/article/details/53928739 package testDouble; import java.util.HashMap; public class Test { static HashMap<String, String> sMap = new HashMap<String, St...
  • 泛型方法4. 泛型接口5. 泛型类可是同时设置多个类型参数6. 泛型的类型参数可以是泛型类7. 泛型类可以继承泛型类8. 泛型类可以实现泛型接口 泛型引入 如果我们需要产生多个对象,每个对象的逻辑完全一样,只是对象内...
  • java类对象中如果想使用泛型需要将类定义如下 也就是Class类名后加一个<T> 如果静态方法中想用泛型应当也是要和Class声明类似的, 所以这时候就需要在方法返回值前面加上一个<T>,用于告诉j
  • 一、泛型类用法、 二、泛型方法用法、 三、泛型通配符 、 四、泛型安全检查、
  • 下面小编就为大家带来一篇JAVA利用泛型返回类型不同的对象方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Java 1.5 之前没有泛型,通常需要使用强制类型转换的方式将一种数据类型转换为另一种数据类型,这种转换要求开发者对实际参数的类型具有可预知性。对于强制类型转换错误的情况,编译器可能不会提示错误,但是在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 303,145
精华内容 121,258
关键字:

java泛型方法