我刚刚发现了一个非常有趣的Java技巧:
void method1(Integer... a){
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以根据需要为此方法提供尽可能多的整数.
现在,如果我有一个类似的(重载)方法,如下所示:
void method1(int a, int b){
}
Run Code Online (Sandbox Code Playgroud)
执行以下行时运行哪个方法:
method1(1, 2);
Run Code Online (Sandbox Code Playgroud)
好吧,我可以通过用不同的方法指令测试它很容易找到它但是当我想到"重载"方法中的"规则"时,我必须确保每个重载方法必须相同,以便编译器知道究竟要使用哪一个.
在我看来,上面的代码不应该工作,因为编译器应该混淆.但是,当我尝试它时,它的工作原理.
所以..有没有人知道更多关于此的背景信息?
假设我声明一个函数如下:
def test(args: String*) = args mkString
Run Code Online (Sandbox Code Playgroud)
是什么类型的args?
在Swift中,如何将数组转换为元组?
问题出现了,因为我试图调用一个函数,该函数在一个带有可变数量参数的函数中接受可变数量的参数.
// Function 1
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
// Example Usage
sumOf(2, 5, 1)
// Function 2
func averageOf(numbers: Int...) -> Int {
return sumOf(numbers) / numbers.count
}
Run Code Online (Sandbox Code Playgroud)
这个averageOf实现对我来说似乎很合理,但它不能编译.当您尝试调用时,它会出现以下错误sumOf(numbers):
Could not find an overload for '__converstion' that accepts the supplied arguments
Run Code Online (Sandbox Code Playgroud)
里面averageOf,numbers有类型Int[].我相信sumOf期待一个元组而不是阵列.
因此,在Swift中,如何将数组转换为元组?
PHP支持可变参数的扩展运算符.
在JavaScript中,您可以使用spread运算符来执行此操作:
var a = [1, 2];
var b = [...a, 3, 4];
console.log(b); // [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
但是,尝试在PHP中执行此操作:
$a = [1, 2];
$b = [...$a, 3, 4];
var_dump($b);die;
Run Code Online (Sandbox Code Playgroud)
结果出现此错误:
解析错误:语法错误,意外'...'(T_ELLIPSIS),期待']'
在PHP中不允许使用这种方式使用扩展运算符吗?如果是这样,是否有同样优雅的方式来达到同样的效果?
Java varargs实现中似乎存在一个错误.当方法使用不同类型的vararg参数重载时,Java无法区分适当的类型.
它给了我一个错误 The method ... is ambiguous for the type ...
请考虑以下代码:
public class Test
{
public static void main(String[] args) throws Throwable
{
doit(new int[]{1, 2}); // <- no problem
doit(new double[]{1.2, 2.2}); // <- no problem
doit(1.2f, 2.2f); // <- no problem
doit(1.2d, 2.2d); // <- no problem
doit(1, 2); // <- The method doit(double[]) is ambiguous for the type Test
}
public static void doit(double... ds)
{
System.out.println("doubles");
}
public static void doit(int... is)
{
System.out.println("ints"); …Run Code Online (Sandbox Code Playgroud) 为什么这不起作用?
val f = (args: Int*) => args.sum
error: ')' expected but identifier found.
val f = (args: Int*) => args.sum
^
Run Code Online (Sandbox Code Playgroud)
然而,这非常好
def sum(args: Int*) = args.sum
val f = sum _
Run Code Online (Sandbox Code Playgroud)
这样做
val f: (Int*) => Int = args => args.sum
Run Code Online (Sandbox Code Playgroud)
顺便说一句.我正在使用scala 2.9.1
我需要找到3个值之间的最小值,我最终做了这样的事情:
Math.Min(Math.Min(val1, val2), val3)
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎有点傻,因为其他语言使用可变函数.我非常怀疑这是一个疏忽.
有什么理由说明简单的Min/Max函数不是变量的吗?是否有性能影响?有没有我没注意到的可变版本?
我有一个填充了元素的arrayList.我想将该数组列表的元素作为参数传递给可变参数函数.
我的功能
public SequenceEntityModifier(final IEntityModifier... pEntityModifiers)
Run Code Online (Sandbox Code Playgroud)
我的ArrayList
ArrayList<IEntityModifier> arr = new ArrayList<IEntityModifier>();
arr.add(new MoveXModifier(1, 50, 120));
arr.add(new MoveXModifier(1, 120, 50));
Run Code Online (Sandbox Code Playgroud)
我想将它传递给函数,好像我会单独传递它们一样.
new SequenceEntityModifier( /* elements of arr here */ );
Run Code Online (Sandbox Code Playgroud)
这样的事情可能吗?
提前致谢.
例如,((fn-stringappend string-append) "a" "b" "c") 我知道如何处理这个问题(f x y z).但是,如果参数数量未知,该怎么办?有没有办法处理这类问题?
以下代码无法编译.
package varargspkg;
public class Main {
public static void test(int... i) {
for (int t = 0; t < i.length; t++) {
System.out.println(i[t]);
}
System.out.println("int");
}
public static void test(float... f) {
for (int t = 0; t < f.length; t++) {
System.out.println(f[t]);
}
System.out.println("float");
}
public static void main(String[] args) {
test(1, 2); //Compilation error here quoted as follows.
}
}
Run Code Online (Sandbox Code Playgroud)
发出编译时错误.
对于测试的引用是不明确的,varargspkg.Main中的方法test(int ...)和varargspkg中的方法test(float ...)匹配
这似乎是显而易见的,因为在方法调用的参数值test(1, 2);可以提升int以及float
如果任何一个或两个参数后缀为F或f,则编译.
但是,如果我们使用相应的包装器类型表示方法签名中的接收参数,如下所示 …