2010-05-05 4 views
3

Я хотел бы определить метод, принимающий varargs, так что я получаю типы, с которыми он был вызван даже в случае нулей.типы захвата параметров varargs

def foo(args: Any*) = .... 

val s: String = null 

foo(1, s) // i'd like to be able to tell in foo that args(0) is Int, args(1) is String 
+0

Связано с: http://stackoverflow.com/questions/2593510/emulating-variadic-templates-in-scala –

ответ

4

В терминах исходного вопроса, я уверен, что это не возможно.

Не зная точно, чего вы пытаетесь достичь (то есть, почему он должен быть списком произвольных типов с переменной длиной), трудно предложить альтернативу. Тем не менее, есть две вещи, которые пришли мне на ум, когда я прочитал вопрос, который может быть для вас вариантом: Default argument values в сочетании с именованными аргументами (требуется Scala 2.8+) и HList тип данных (менее вероятно).

6

Если вы используете Any в качестве типа параметра вы не сможете определить тип аргументов статически. Вы должны будете использовать instanceof или соответствие шаблона:

def foo(args: Any*) = for (a <- args) a match { 
    case i: Int => 
    case s: String => 
    case _ => 
} 

Unfortuntely, это не в состоянии обработать нулевые значения.

Если вы хотите статические типы вы должны будете использовать перегрузки:

def foo[A](arg1: A) 
def foo[A, B](arg1: A, arg2: B) 
def foo[A, B, C](arg1: A, arg2: B, arg3: C) 
... 
+1

Или используйте язык, который поддерживает типизированные «varargs», такие как TypedScheme :) – leppie

3

Поскольку вы используете Any как тип вы не можете получить тип аргументов. Тип Any не имеет метода getClass (он даже не является ссылочным классом). См. http://www.scala-lang.org/node/128 для получения дополнительной информации.

Что вы можете попробовать это:

def foo(args: Any*) = args.map { arg => { 
    arg match { 
    case reference:AnyRef => reference.getClass.toString 
    case null => "null" 
}}} 

val s: String = null 

val result = foo("a", 1, 'c', 3.14, s, new Object, List(1), null) 

result.foreach(println) 

Это выходы:

class java.lang.String 
class java.lang.Integer 
class java.lang.Character 
class java.lang.Double 
null 
class java.lang.Object 
class scala.collection.immutable.$colon$colon 
null 
Смежные вопросы