Tag: variadic functions

类型安全:通过varargs参数子树的潜在堆污染

我正在阅读J. Bloch的有效Java,除非我们确保演员阵容是安全的,否则我认为未经检查的演员阵容永远不会好。 现在,由于Java Collection框架没有为我们提供Tree数据结构,我必须自己编写。 public interface TreeVisitor { public R visit(E leaf); public R visit(E val, Tree… subtrees); } public abstract class Tree { public abstract R accept(TreeVisitor visitor); public Tree leaf(E leaf) { return new Tree() { @Override public R accept(TreeVisitor visitor) { return visitor.visit(leaf); } }; } public Tree branch(E value, Tree… subtrees){ […]

如何在java中使用varargs作为Constructor.getConstructor()的参数

我有一个像下面这样的java类,我想通过使用类名动态创建这个类的实例。 class Demo { public Demo(String… s) { //some initialization here. } } 我想使用以下代码创建一个对象 Class klass = Class.forName(“Demo”); Constructor con = klass.getConstructor(“**what should be here**”); Object obj = con.newInstance(param1, param2, …);

如何告诉方法有一个使用reflection的varargs参数?

这是一个示例代码 package org.example; import java.lang.reflect.Method; class TestRef { public void testA(String … a) { for (String i : a) { System.out.println(i); } } public static void main(String[] args){ Class testRefClass = TestRef.class; for (Method m: testRefClass.getMethods()) { if (m.getName() == “testA”) { System.out.println(m); } } } } 输出是 public void org.example.TestRef.testA(java.lang.String[]) 因此,报告该方法的签名采用String数组。 在reflection库中是否有任何意思我可以告诉该方法最初被声明为采用varargs?

是否有更简单的替代方法来模仿splat运算符?

我发现它可以在Ruby中使用,但我从我在Python中所做的事情中认识到它; “splat”运算符。 长话短说,我想知道是否有更简单的方法来完成我目前的工作,模仿“splat”操作符的作用。 我做了一个中心方法,其余的可以打电话,因为我意识到我有几个非常相似的方法,除了一些小的东西,他们都在做同样的事情。 这是方法签名: private String callScript(String scriptLocation, String… extraArgs) throws Exception { 我想要至少一个参数( scriptLocation ),然后允许任意数量的额外参数。 我最终做的就是创建一个ProcessBuilder 。 我的愿望是做这样的事情: ProcessBuilder pb = new ProcessBuilder(“something”, scriptLocation, /* extraArgs */); 但是,当然, ProcessBuilder构造函数只接受以下内容: List String[] String… 所以我的方法显然不起作用。 据我所知,我当前的解决方法是: List finalArgs = new ArrayList(); finalArgs.add(“something”); finalArgs.add(scriptLocation); finalArgs.addAll(Arrays.asList(extraArgs)); ProcessBuilder pb = new ProcessBuilder(finalArgs); (是的,我知道我不必使用List ,只能创建一个String[] ) (是的,我知道我可以遍历extraArgs并将它们单独添加到extraArgs ,而不必使用addAll和Arrays.asList() ) […]

如何用Valist从C调用java vararg方法

我有varargs的C方法 void message(int id, …) 它应该用vararg调用Java静态方法 public static void message(String messageName, String … args) 我怎么能用C valist和JNI API来做呢? 谢谢!

如何创建Stream ,只有一个元素与Stream.of?

使用Stream.of创建通用流非常方便,但是如果我想创建只有一个元素的Stream呢? 假设我有: String[] tropicalFruits = new String[] {“pineapple”, “banana”, “mango”}; String[] fruits = new String[] {“melon”, “peach”, “apple”}; 然后Stream.of(tropicalFruits, fruits)生成两个元素的Stream 。 如何为单个元素的流实现相同的function? 如果我尝试: Stream fruittyStream = Stream.of(tropicalFruits); 我明白了: 错误:不兼容的类型:推理变量T具有不兼容的边界 等式约束: java.lang.String[] 下界: java.lang.String Stream fruittyStream = Stream.of(fruits); ^—————^ 我用Google搜索并搜索了但是我什么也没得到。 在我看来,这不是一个非常不寻常的或esoeteric问题,所以有点令人惊讶我没有得到任何答案(或者我没有用正确的关键词搜索)。

变量长度参数是否被视为Java中的数组?

据我所知, array由固定数量的元素组成,并且variable length argument在传递时使用相同数量的参数(相同类型)。 但他们是一样的吗? 我可以通过另一个预期的地方吗?

是否有针对slf4j的Java 1.5 varargs API?

我想摆脱这一批…… public void info(String msg); public void info(String format, Object arg); public void info(String format, Object arg1, Object arg2); public void info(String format, Object[] argArray); ……并用这个替换它…… public void info(String format, Object … args); …这样我的日志记录语法就不必根据我想记录的参数数量而改变。 似乎有很多讨论和解决方法,但它在哪里? 或者我应该包装slf4j的包装器?

一系列字符串与字符串Varargs

void method(String[] a)和void method(String… a)什么区别? 第一种方法采用字符串数组,其中第二种方法采用一个或多个String参数。 它们提供了哪些不同的function? 此外,不知道为什么,但这是有效的: public class Test { public static void main(String[] args) { String[] a = {“Hello”, “World”}; Test t = new Test(); t.method(a); } void method(String…args) { System.out.println(“Varargs”); // prints Varargs } }

在这种情况下,如何处理Function 和省略号/ varargs?

我的一个项目是扔lambda ; 在其中我的目标是简化Stream中潜在的@FunctionalInterface的使用,它在Stream使用的唯一“缺陷”是它们抛出已检查的exception(就我而言,我宁愿称有缺陷的事实是你不能从流中抛出已检查的exception但这是另一个故事)。 所以,对于Function我定义了这个: @FunctionalInterface public interface ThrowingFunction extends Function { R doApply(T t) throws Throwable; default R apply(T t) { try { return doApply(t); } catch (Error | RuntimeException e) { throw e; } catch (Throwable throwable) { throw new ThrownByLambdaException(throwable); } } } 这允许我定义,例如: final ThrowingFunction = Path::toRealPath; (为什么Path::toRealPath ……好吧, 正是因为它有一个省略号 )。 不想停在这里我希望能够写下这样的东西: […]