Как неявное нахождение правильного метода, который будет вызываться с обобщениями при стирании типов? - PullRequest
1 голос
/ 12 мая 2019

В приведенном ниже коде у меня есть функция test, которая принимает объект типа магнит, и у меня есть два неявных метода, преобразующих List [Int] в магнит, а другой - преобразование List [String] в магнит.

Если предполагается, что JVM потеряет типы в генериках из-за стирания типов во время выполнения, в моем коде ниже оба метода fromListInt и fromListString будут выглядеть как List [Any], верно?Потому что, когда я называю обе функции одинаковыми именами, я получаю сообщение об ошибке error: double definition:, предполагающее, что оба List [Int] и List [String] считаются одинаковыми.

как в этом случае можно найти правильные неявные методы, когда япройти список (0) и список («0»)?

scala> trait magnet {
     | def printSomething: Unit
     | }
defined trait magnet

scala> object magnet {
     | implicit def fromListInt(future: List[Int]): magnet = {
     | new magnet { def printSomething: Unit = println("test int") }
     | }
     | implicit def fromListString(future: List[String]): magnet = {
     | new magnet { def printSomething: Unit = println("test string") }
     | }
     | }
defined object magnet
scala> def test(in: magnet): Unit = {
     | in.printSomething
     | }
test: (in: magnet)Unit

scala> import magnet._
import magnet._

scala> test(List(0))
test int

scala> test(List("0"))
test string

Ответы [ 2 ]

2 голосов
/ 12 мая 2019

Последствия разрешаются во время компиляции, а не во время выполнения.Во время компиляции ничего не было стерто.Полная информация о типе доступна компилятору.

В REPL каждый раз, когда вы вводите строку кода, вы компилируете ее перед запуском.test(List(0)) преобразуется компилятором во что-то вроде test(fromListInt(List(0))), и то, что скомпилировано, и вот такое поведение вы видите.test(List("0")) преобразуется компилятором во что-то вроде test(fromListString(List("0"))), и вот такое поведение вы видите там.

1 голос
/ 12 мая 2019

Последствия разрешаются во время компиляции. Во время компиляции типы еще не стираются.

test(List(0)) на самом деле test(fromListInt(List(0))), test(List("0")) на самом деле test(fromListString(List("0"))).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...