java7 简化变参方法调用实例方法

这是所有修改里最简单的一个,只是去掉了方法签名中同时出现变参和泛型时才会出现的类型警告信息。

换句话说,除非你写代码时习惯使用类型为T的不定数量参数,并且要用它们创建集合,否则你就可以进入下一节了。如果你想要写下面这种代码,那就继续阅读本节:

public static <T> Collection<T> doSomething(T... entries) {
 ...
}

还在?很好。这到底是怎么回事?

变参方法是指参数列表末尾是数量不定但类型相同的参数方法。但你可能还不知道变参方法是如何实现的。基本上,所有出现在末尾的变参都会被放到一个数组中(由编译器自动创建),并作为一个参数传入。

这是个好主意,但是存在一个公认的Java泛型缺陷——不允许创建已知类型的泛型数组。比如下面这段代码,编译就无法通过:

HashMap<String, String>[] arrayHm = new HashMap<>[2]; 

不可以创建特定泛型的数组,只能这样写:

HashMap<String, String>[] warnHm = new HashMap[2];

可这样编译器会给出一个只能忽略的警告。你可以将warnHm的类型定义为HashMap<String,String>数组,但不能创建这个类型的实例,所以你不得不硬着头皮(或至少忘掉警告)硬生生地把原始类型(HashMap数组)的实例塞给warnHm。

这两个特性(编译时生成数组的变参方法和已知泛型数组不能是可实例化类型)碰到一起时,会令人有点头疼。看看下面这段代码:

HashMap<String, String> hm1 = new HashMap<>();
HashMap<String, String> hm2 = new HashMap
Collection<HashMap<String, String>> coll = doSomething(hm1,hm2);

编译器会尝试创建一个包含hm1和hm2的数组,但这种类型的数组应该是被严格禁止使用的。面对这种进退两难的局面,编译器只好违心地创建一个本来不应出现的泛型数组实例,但它又觉得自己不能保持沉默,所以还得嘟囔着警告你这是“未经检查或不安全的操作”。

从类型系统的角度看,这非常合理。但可怜的开发人员本想使用一个十分靠谱的API,一看到这些吓人的警告,却得不到任何解释,不免会内心忐忑。

以上就是本次介绍的全部知识点内容,希望我们整理的内容能够帮助到大家。

(0)

相关推荐

  • Java中的可变参数常见用法实例总结

    本文实例讲述了Java中的可变参数常见用法.分享给大家供大家参考,具体如下: 前言: 到J2SE 1.4为止,一直无法在Java程序里定义实参个数可变的方法--因为Java要求实参(Arguments)和形参(Parameters)的数量和类型都必须逐一匹配,而形参的数目是在定义方法时就已经固定下来了.尽管可以通过重载机制,为同一个方法提供带有不同数量的形参的版本,但是这仍然不能达到让实参数量任意变化的目的. 然而,有些方法的语义要求它们必须能接受个数可变的实参--例如著名的main方法,就需要

  • java中的可变参数使用方法

    java中的可变参数使用方法 可变参数时Java 1.5新增的方法,可变参数方法接收0个或者多个指定类型的参数,可变参数机制通过先创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递给方法.如: public class Test{ public int sum(int... args) { int sum = 0; for (int arg : args) { sum += arg; } return sum; } } 可变参数提供了方便,但是使用可变参

  • 详谈Java枚举、静态导入、自动拆装箱、增强for循环、可变参数

    一.枚举简介 1.什么是枚举? 需要在一定范围内取值,这个值只能是这个范围内中的任意一个 现实场景:交通信号灯,有三种颜色,但是每次只能亮三种颜色里面的任意一个 2.使用一个关键字 enum enum Color3 { RED,GREEN,YELLOW; } *枚举的构造方法也是私有化的 *特殊枚举的操作 **在枚举类里面有构造方法 **在构造方法里面有参数,需要在每个实例上都写参数 **在枚举类里面有抽象方法 **在枚举的每个实例里面都重写这个抽象方法 3.枚举的api的操作 **name()

  • Java数组传递及可变参数操作实例详解

    本文实例讲述了Java数组传递及可变参数操作.分享给大家供大家参考,具体如下: 方法可以操作传递和返回基本数据类型,但是方法中也可用来传递和返回数组.如果要向方法中传递一个数组,则方法的接收参数处必须是符合其类型的数组.而且数组属于引用数据类型,所以在把数组传递进方法之后,如果方法对数组本身做了任何修改,修改结果都是会保存下来的. 向方法中传递数组 在java中,所有对象都是通过引用进行操作的.而数组也是一种对象,当把数组作为参数传递给方法时,传递的实际上就是数组对象的引用.在方法中对数组的所有

  • java可变参数当做数组处理的方法示例

    本文实例讲述了java可变参数当做数组处理的方法.分享给大家供大家参考,具体如下: java可变参数当做数组处理 ava1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理. 注意:可变参数必须位于最后一项. 原因:当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数.因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项. 可变参数的特点:

  • Java可变参数列表详解

    Java可变参数列表详解 1.接受的传入参数情况: 如public void test(String ...args){...} 1)不使用参数,如test() 2)使用一个或多个参数,如test("1"); test("1","2"); 3)使用数组 test(new String[]{"1","2"}); 2.方法内部访问参数: 在test方法内部,我们可以像使用数组的访问方式一样来访问参数args.如

  • Kotlin传递可变长参数给Java可变参数实例代码

    本文研究的主要是Kotlin传递可变长参数给Java可变参数的方法,具体实现代码如下. 定义Java可变参数方法 package com.tcl.john.studymvvm.utils; /** * 调用Java方法的工具类 * Created by ZhangJun on 2017/10/25. */ public class CallJavaUtils { public static int addNumbers(String name, int... args) { int result

  • java7 简化变参方法调用实例方法

    这是所有修改里最简单的一个,只是去掉了方法签名中同时出现变参和泛型时才会出现的类型警告信息. 换句话说,除非你写代码时习惯使用类型为T的不定数量参数,并且要用它们创建集合,否则你就可以进入下一节了.如果你想要写下面这种代码,那就继续阅读本节: public static <T> Collection<T> doSomething(T... entries) { ... } 还在?很好.这到底是怎么回事? 变参方法是指参数列表末尾是数量不定但类型相同的参数方法.但你可能还不知道变参方

  • Swift中动态调用实例方法介绍

    在 Swift 中有一类很有意思的写法,可以让我们不直接使用实例来调用这个实例上的方法,而是通过类型取出这个类型的某个实例方法的签名,然后再通过传递实例来拿到实际需要调用的方法.比如我们有这样的定义: 复制代码 代码如下: class MyClass {     func method(number: Int) -> Int {         return number + 1     } } 想要调用 method 方法的话,最普通的使用方式是生成MyClass的实例,然后用.method来

  • 详解Struts2动态方法调用

    动态方法就是一个Action对应多个请求,减少Action的数量 1.指定method属性 <action name="addAction" method="add" class="com.venn.action.HelloWorldAction"> <result>/jsp/add.jsp</result> </action> 2.感叹号(!)方式(不推荐使用) <action name=&

  • jQuery源码解读之extend()与工具方法、实例方法详解

    本文实例讲述了jQuery源码解读之extend()与工具方法.实例方法.分享给大家供大家参考,具体如下: 使用jQuery的时候会发现,jQuery中有的函数是这样使用的: $.get(); $.post(); $.getJSON(); 有些函数是这样使用的: $('div').css(); $('ul').find('li'); 有些函数是这样使用的: $('li').each(callback); $.each(lis,callback); 这里涉及到两个概念:工具方法与实例方法.通常我们

  • JAVA的LIST接口的REMOVE重载方法调用原理解析

    前言 说真的,平常看源码都是自己看完自己懂,很少有写出来的冲动. 但是在写算法的时候,经常用到java中各种集合,其中也比较常用到remove方法. remove有重载函数,分别传入参数是索引index或者数据Object(指定泛型后自动转换),如果指定泛型是其他数据类型还好,但是指定的是Integer或者是int的话,或者就有点懵了. 这曾经也困惑过我,所以我就唯有用实践解惑了. 测试类设计 测试类一 public class Text { public void remove(int ind

  • 实例讲解Ruby中的钩子方法及对方法调用添加钩子

    钩子方法有些类似事件驱动装置,可以在特定的事件发生后执行特定的回调函数,这个回调函数就是钩子方法(更形象的描述: 钩子方法可以像钩子一样,勾住一个特定的事件.),在Rails中before\after函数就是最常见的钩子方法. Class#inherited方法也是这样一个钩子方法,当一个类被继承时,Ruby会调用该方法.默认情况下,Class#inherited什么都不做,但是通过继承,我们可以拦截该事件,对感兴趣的继承事件作出回应. class String def self.inherit

  • jquery.Ajax()方法调用Asp.Net后台的方法解析

    利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法.先来个简单的实例热热身吧. 1.无参数的方法调用asp.net code: 复制代码 代码如下: using System.Web.Script.Services; [WebMethod]   public static string SayHello()   {        return "Hello Ajax!";   }  using System.Web.Script.Services; [WebMe

  • ThinkPHP里用U方法调用js文件实例

    本文实例讲述了ThinkPHP里用U方法调用js文件的方法.分享给大家供大家参考.具体如下: 在TP里提供了在模板文件中直接调用函数的快捷方法.U是其中之一.手册里有它的用法: 复制代码 代码如下: {:U('User/insert' )} 先把js文件的后缀改成html(这个不会影响),然后写个JsAction,在里面进行调用: <?php class JsAction extends Action{ function nav() { $this->display('Index:js:nav

  • Fragment 多层嵌套方法调用问题的解决方案

    Fragment的产生与介绍 Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的.难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊.Fragment的出现就是为了解决这样的问题.你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生

  • JavaScript中的方法调用详细介绍

    JavaScript中,如果function属于一个对象,那么通过对象来访问该function的行为称之为"方法调用".与普通的函数调用不同的是,在进行方法调用时,function中的this指代将发生变化 - this将指代用于调用该function的对象(该对象将成为方法调用的invocation context): 复制代码 代码如下: var x = 99; var sample = {   x:1,   act:function(a){     this.x = a*a;//

随机推荐