захватывать типы параметров varargs - PullRequest
3 голосов
/ 05 мая 2010

Я бы хотел определить метод, принимающий 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

Ответы [ 3 ]

6 голосов
/ 05 мая 2010

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

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

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

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

def foo[A](arg1: A)
def foo[A, B](arg1: A, arg2: B)
def foo[A, B, C](arg1: A, arg2: B, arg3: C)
...
4 голосов
/ 05 мая 2010

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

Не зная точно, чего вы пытаетесь достичь (т. Е. Почему это должен быть список произвольной длины переменной длины), трудно предложить альтернативу. Однако, когда я прочитал вопрос, который может быть вам полезен, мне пришло в голову две вещи: Значения аргументов по умолчанию в сочетании с именованными аргументами (требуется Scala 2.8+) и HList тип данных (менее вероятно).

3 голосов
/ 05 мая 2010

Поскольку вы используете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...