Scala中能否限制变长参数方法的参数仅为String和Integer类型?
Scala限制变长参数仅允许String和Integer类型的实现方法
当然可以,Scala提供了多种方式实现这种类型限制,不同版本的实现方式略有区别:
1. Scala 3+:使用联合类型(最简洁)
Scala 3原生支持联合类型,可直接指定变长参数的类型为String | Int,编译阶段就会拦截不符合类型的参数:
def myMethod(input: (String | Int)*) = { input.foreach(println) } // 合法调用,正常运行 myMethod("q", "w", "e", 1, 2, 3) // 非法调用,编译直接报错(比如传入布尔值) // myMethod(true, false)
2. Scala 2:使用密封特质+隐式转换
Scala 2没有原生联合类型,可以通过定义密封特质,仅为String和Int提供隐式转换的方式,实现编译时的类型限制:
// 定义密封特质,仅内部提供转换逻辑 sealed trait StringOrInt object StringOrInt { implicit def stringToWrapper(s: String): StringOrInt = new StringOrInt {} implicit def intToWrapper(i: Int): StringOrInt = new StringOrInt {} } // 方法接收StringOrInt类型的变长参数 def myMethod(input: StringOrInt*) = { input.foreach { case s: String => println(s) case i: Int => println(i) } } // 合法调用 myMethod("q", "w", 1, 2) // 非法调用,编译报错 // myMethod(true, false)
3. 运行时检查(不推荐)
如果只是临时需求,也可以保留Any*参数,在方法内部通过模式匹配做运行时类型检查,但这种方式无法在编译阶段拦截错误参数,只有运行时才会报错:
def myMethod(input: Any*) = { input.foreach { case s: String => println(s) case i: Int => println(i) case invalid => throw new IllegalArgumentException(s"不支持的参数类型:${invalid.getClass}") } } // 传入布尔值会在运行时抛出异常 // myMethod(true)
优先推荐前两种编译时检查的方式,能更早发现错误,避免运行时异常。
内容的提问来源于stack exchange,提问作者Amerousful
相关产品推荐
相关产品推荐

