scala передает переменный список параметров и типов в функцию - PullRequest
0 голосов
/ 19 декабря 2018

Как я могу передать переменный список параметров и типов в функцию?Т.е. изображенный подход, использующий сопоставление с образцом, кажется немного неуклюжим.В trait определена функция foo.Однако в конкретных реализациях другой подтип (с дополнительными полями следует использовать).Есть ли более чистый подход, чем использование сопоставления с образцом?

def foo[T <: MyBaseConfiguration](config: T) = {
  println("do smething")
  println(config.configValue)
}

override def foo[T <: MyBaseConfiguration](config: T) = {
  config match {
    case c: MyOtherConfiguration => {
      println("do smething else")
      println(c.configValue)
      println(c.otherValue)

    }
  }
}

trait MyBaseConfiguration {
  def configValue: String
}

class MyOtherConfiguration extends MyBaseConfiguration {
  val otherValue = 1234

  override def configValue = "abcd"
}

edit

В основном, я просто хочу сказать * есть функция f с определенным возвращаемым значением TReturn, нобыть независимым от входных параметров.Тем не менее, мне нужно иметь возможность использовать / получать к ним доступ во время выполнения f.

1 Ответ

0 голосов
/ 19 декабря 2018

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

trait Foo {
  def foo[T <: MyBaseConfiguration](config: T) = {
    println("do smething")
    println(config.configValue)
  }
}

class Foo2 extends Foo {
  override def foo[T <: MyOtherConfiguration](c: T) = {
    println("do smething else")
    println(c.configValue)
    println(c.otherValue)
  }
}

Однако это не сработает , поскольку нарушает безопасность типов.Рассмотрим следующее:

class MyThirdConfiguration extends MyBaseConfiguration {...}

val foo2: Foo = new Foo2
val cfg: MyBaseConfiguration = new MyThirdConfiguration

foo2.foo(cfg)

foo2 является экземпляром Foo2, но выглядит как Foo.cfg является экземпляром MyThirdConfiguration, но выглядит как MyBaseConfiguration.Так что foo2.foo(cfg) вызывает Foo2.foo с объектом, который не является MyOtherConfiguration и не имеет дополнительных полей, даже если типы совпадают.

Обратите внимание, что Foo2.foo может быть определено для получения суперкласс из MyBaseConfiguration, поскольку это не нарушит безопасность типов.

Также обратите внимание, что типы результатов для перегруженных функций работают наоборот.Вы можете вернуть подкласс типа, возвращаемого базовой функцией, но не суперкласс, поскольку первый является безопасным типом, а второй - нет.

...