Tag: variadic functions

Varargs在Java中使用null参数

以下代码仅使用空引用作为varargs参数。 package currenttime; import java.util.Arrays; public class Main { private static void temp(String…str) { System.out.println(Arrays.asList(str)); } public static void main(String[] args) { temp(null,null); temp(null); } } 第一次调用方法temp(null, null); displays [null, null]表示str[0]=null且str[1]=null 。 但后来调用temp(null); 导致抛出NullPointerException ,看起来str本身为null 。 如果它的类型转换为String类似于这个temp((String)null); ,它工作并显示[null] 。 为什么在最后一次调用中,需要显式类型转换? 在我看来,它被认为是一个带有null引用的字符串数组,它与第一次调用不同。 什么是正确的答案?

带有变量参数列表的抽象方法

我还没有找到解决这个问题的优雅方法。 我有一个抽象类,其他几个类inheritance了一个抽象方法,可以包含0到4-5个不同类型的参数。 public abstract class Item { public abstract void use(); } 例如,我有一个inheritance了这个并且在重写use()时没有参数的Book类,我有一个Key类,它inheritance并在重写时将String和Queue作为参数… 我已经尝试过使用generics,但是当它实际上取决于类时,我必须输入使用的数字,例如Item。 public abstract class Item { public abstract void use(T arg1, U arg2); //Number of arguments/types could be more or less } 我已经尝试发送一个对象的变量列表,但对象类型总是变量的,我不确定在inheritance类中接收的语法。 public abstract class Item { public abstract void use(T… arguments); } public class Book extends Item { public void […]

叫哪种方法? (整数… a)vs.(int a,int b)

我刚刚发现了一个非常有趣的Java技巧: void method1(Integer… a){ } 因此,您可以根据需要为此方法提供尽可能多的整数。 现在,如果我有一个类似的(重载)方法,如下所示: void method1(int a, int b){ } 执行以下行时运行哪个方法: method1(1, 2); 好吧,我可以通过使用不同的方法指令测试它很容易找到它但是当我考虑“重载”方法中的“规则”时,我必须确保每个重载方法必须相同,以便编译器知道究竟要使用哪一个。 在我看来,上面的代码不应该工作,因为编译器应该混淆。 但是,当我尝试它时,它的工作原理。 那么..有没有人知道更多关于此的背景信息?

“…”在参数列表中的含义是什么? doInBackground(String … params)

我不懂语法。 试图谷歌各种单词加“……”是没用的。

Java 8generics函数应该是不明确的,但在运行时失败

我正在尝试将Java 7代码迁移到Java 8,所以我的代码类似于: package tests; import java.util.Arrays; import java.util.Map; public class Tests { private static interface ComparableMap extends Map, Comparable {} public static void main(String[] args) { func(getString()); } private static void func(Comparable…input){ System.out.println(Arrays.toString(input)); } private static void func(ComparableMap m){ System.out.println(m); } private static T getString(){ return (T) “aaa”; } } 在java 7中它正常工作,在java 8中我得到: java.lang.ClassCastException:java.lang.String无法强制转换为tests.Tests […]

Java编译器如何为具有多个边界的参数化类型选择运行时类型?

我想更好地理解当Java编译器遇到如下方法的调用时会发生什么。 void printType(T… args) { System.out.println(args.getClass().getComponentType().getSimpleName()); } // printType() prints “AutoCloseable” 我很清楚,在运行时没有类型 ,所以编译器做了它可以做的最不对的事情,并创建一个类型为两个边界接口之一的数组,丢弃另一个。 无论如何,如果切换接口的顺序,结果仍然是相同的。 void printType(T… args) { System.out.println(args.getClass().getComponentType().getSimpleName()); } // printType() prints “AutoCloseable” 这导致我做了一些调查,看看接口发生变化时会发生什么。 在我看来,编译器使用某种严格的顺序规则来决定哪个接口是最重要的 ,并且接口在代码中出现的顺序不起作用。 // “AutoCloseable” // “AutoCloseable” // “Serializable” // “Serializable” // “SafeVarargs” // “SafeVarargs” // “Channel” // “Channel” // “Channel” 问题:当存在多个边界时,Java编译器如何确定参数化类型的varargs数组的组件类型? 我甚至不确定JLS是否对此有所说明,而且我通过谷歌搜索发现的任何信息都没有涵盖这一特定主题。

我错过了什么,或者varargs打破Arrays.asList?

private void activateRecords(long[] stuff) { … api.activateRecords(Arrays.asList(specIdsToActivate)); } 不应该调用Arrays.asList返回Long s的列表吗? 而是返回List public static List asList(T… a) 方法签名与结果一致,varargs将整个数组抛出到列表中。 它与new ArrayList(); list.add(myArray)相同new ArrayList(); list.add(myArray) new ArrayList(); list.add(myArray)是的,我知道它的意思是这样使用: Arrays.asList(T t1, T t2, T t3) 我想我得到的是,而不是varargsforms,为什么我不能只使用我的旧asList方法(至少我认为这是它以前的工作方式),它将获取内容并将它们单独放入一个列表? 这样做还有其他干净的方法吗?

使用varargs重载function

这不会编译: public class Methods { public static void method(Integer… i) { System.out.print(“A”); } public static void method(int… i) { System.out.print(“B”); } public static void main(String args[]) { method(7); } } 这将编译和工作: public class Methods { public static void method(Integer i) { System.out.print(“A”); } public static void method(int i) { System.out.print(“B”); } public static void main(String […]

使用varargs重载Java 7

可能重复: varargs和重载的错误? 任何人都可以解释我这是如何工作的: class Vararg { static void vararg(int… x) { System.out.println(“Integer…”); } static void vararg(long… x) { System.out.println(“long…”); } public static void main(String [] args) { int s = 0; vararg(s,s); } } 获取编译时错误 class Vararg { static void vararg(Integer… x) { System.out.println(“Integer…”); } static void vararg(long… x) { System.out.println(“long…”); } public static void […]

如何向Varargs添加新元素?

我有一个方法 public boolean findANDsetText (String Description, String … extra ) { 在里面我想调用另一个方法并传递extras但我想添加新的元素(描述)到额外的。 object_for_text = getObject(find_arguments,extra); 我怎么能在java中这样做? 代码会是什么样的? 我厌倦了容纳这个问题的代码,但无法使其工作。