- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
注意我已经查看了以下问题/答案来解决问题,但没有任何运气。 Call Java Varargs Method from Kotlin - 这个在参数列表的末尾有可变参数参数,但我的问题涉及参数列表开头的可变参数。 Kotlin: Convert List to Java Varargs - 相同。其他搜索也得到同样的结果。这些是我能找到的最接近的。
我正在使用单个字符分隔符调用 Kotlin String.split
方法。 这是一个 vararg
方法,其中 vararg
参数是多个参数中的第一个。该方法的定义如下:
public fun CharSequence.split(vararg delimiters: Char,
ignoreCase: Boolean = false,
limit: Int = 0): List<String>
当我调用如下方法时,它可以正常编译:
fun String.splitRuleSymbol() : String = this.split(':') //ok
但是当我尝试添加 ignoreCase
和 limit
参数时,我遇到了问题:
fun String.splitRuleSymbol() : String = this.split(':', true, 2) //compiler error
我得到的错误是...
None of the following functions can be called with the arguments supplied:
public fun CharSequence.split(vararg delimiters: String, ignoreCase: Boolean = ..., limit: Int = ...): List defined in kotlin.text
public fun CharSequence.split(vararg delimiters: Char, ignoreCase: Boolean = ..., limit: Int = ...): List defined in kotlin.text
对我来说,有一个 vararg
参数后跟其他参数有点奇怪,但这不是重点。如果我按如下方式调用它,它就可以正常工作:
// both of the following compile
fun String.splitRuleSymbol() : String =
this.split(delimiters = ':', ignoreCase = true, limit = 2)
fun String.splitRuleSymbol2() : String =
this.split(';', ignoreCase = true, limit = 2)
有没有办法将 vararg Char
传递到此方法,而不必使用参数名称 ignoreCase
和 limit 限定我的其他两个参数
?编译器不能判断其余参数不是Char
吗?
我已经尝试过the spread operator以及下面的其他一些方法,但都不起作用:
//compiler errors on all these
this.split(*':', true, 2) //using the "spread" operator
this.split(*charArrayOf(':'), true, 2)
this.split(*mutableListOf(':'), true, 2)
this.split(*Array<Char>(1) { ':' }, true, 2)
是的,我知道其中一些看起来很荒谬。但是,有没有办法避免冗长的替代方案呢?
PS当我提出问题时,我发现了另一个可以编译的表达式。
this.split(':', limit = 2)
这不太冗长,并且由于我不需要更改默认的 ignoreCase
参数,因此它更接近我正在寻找的内容。
最佳答案
您的观察是正确的。 vararg
参数后面的参数只能使用命名参数传入,否则会遇到歧义问题(举个简单的例子,假设所有参数都是 类型时)任何
)。
我现在能找到的最好的来源是这个 book .
The vararg parameter is usually the last parameter, but it does not always have to be. If there are other parameters after vararg, then arguments must be passed in using named parameters
编辑:@Les 找到了一个很好的来源,请参阅 their answer .
关于以 Vararg 作为第一个参数的 Kotlin 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46456213/
我收到以下代码的警告:对最后一个参数的参数类型不精确的 varargs 方法进行非 varargs 调用;我该如何修复它? private static boolean checkImpled(Cl
我是一名学生,试图让这个回文检查器反射(reflect)输入的字符串是否确实是回文。我一直只返回一个结果,但我不明白为什么。不确定我的循环中是否遗漏了某些内容,或者我的循环中是否有不正确的内容。 pu
这个问题已经有答案了: Overloading function using varargs (3 个回答) 已关闭 6 年前。 为什么下面的代码给出编译错误“The method show(Obje
我的代码正在运行,但我收到了来自 Intelij 的警告(代码突出显示):不清楚是否需要可变参数或非可变参数调用。但代码确实完善了我想要的或我期望的,用值填充组合。当我单击组合中的项目时,它会返回正确
我在 JDK 1.8 上使用 IntelliJ IDEA 和 javac。我有以下代码: class Test { @SafeVarargs final void varargsMet
这在 Clojure 中相当简单 - (def a (partial println "Hello:")) (a "Bob") (a "Bob" "Ganesh") 但这在 Ruby 中似乎很难。 :
这个问题在这里已经有了答案: Why do I get a compilation warning here (var args method call in Java) (5 个答案) 关闭 6
这是我收到警告的示例代码。 Class aClass = Class.forName(impl); Method method = aClass.getMethod("getInstance", nu
使用 Java varargs 作为可选参数是否被认为是一个很好的编程习惯? 甚至更多:如果我有一个接口(interface),并且某些实现需要附加参数,而有些则不需要,是否可以在方法签名中为可选参数
像 printf 这样的可变参数函数如何找出它们得到的参数数量? 参数的数量显然不是作为(隐藏的)参数传递的(参见 call to printf in asm example here )。 有什么诀
Java 没有文字映射语法,因此我正在尝试按文字初始化 map 的方法。编译器警告可能来自参数化可变参数类型的堆污染,这对我来说是新的,所以我读到了这一点。我认为我可以安全地使用相关注释来抑制这些警告
public class OverloadingVarargsMethodWithNormalMethod { static void a(int... c){ Syste
我有以下定义某种类型的接口(interface) public interface BaseInterface { } 该接口(interface)将用于实现几个枚举,如下所示: public enu
我将 android Log 类包装在我自己的中 public static void d(String tag, String msg, long... varArgs) { Log.d(t
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试应用可变参数。我已经声明了一个需要无限数量变量的方法,如下所示: private Subject carMonitor; public AdvancedMonitor(Subject ...
我正在为 JVM 中的所有操作码编写一个枚举。它不完整,到目前为止看起来像这样: public enum Opcode { NOP(), ACONST_NULL(), ICON
这个问题在这里已经有了答案: Arrays.asList() not working as it should? (12 个答案) 关闭 5 年前。 在 Effective Java 中,J. Bl
我想选择性地调用函数或将其转换为字符串(打印出来)。以下不起作用: #if !defined(ENABLE_FUNCS) #define APPLY(func, ...) do { (func(__V
我有这个简单的 varargs 方法来划分列表中的每个项目: import java.util.*; class A { static long f(long... xs) { A
我是一名优秀的程序员,十分优秀!