Два неявных определения с одним и тем же именем для метода - PullRequest
1 голос
/ 27 июня 2019

У меня есть два неявных объявления, которые «переопределяют» x как оператор:

import scala.io.StdIn._
import util._
import scala.language.postfixOps


case class Rectangle(width: Int, height: Int)
case class Circle(ratio: Integer)
case class Cylinder[T](ratio: T, height: T)


object implicitsExample1 {

    implicit class RectangleMaker(width: Int) {
        def x(height: Int) = Rectangle(width, height)
    }

    implicit class CircleMaker(ratio: Int) {
        def c = Circle(ratio)
    }

    implicit class CylinderMaker[T](ratio: T) {
        def x(height: T) = Cylinder(ratio, height)
    }


    def main(args: Array[String]) {

        val myRectangle = 3 x 4
        val myCircle = 3 c
        val myCylinder = 4 x 5

        println("myRectangle = " + myRectangle)

        println("myCircle = " + myCircle) 

        println("myCylinder = " + myCylinder)

    }

}

Здесь мой вывод дает:

myRectangle = Rectangle(3,4)
myCircle = Circle(3)
myCylinder = Rectangle(4,5)

Что мне нужно сделать, чтобы получить что-то вроде:

myCylinder = Cylinder[Int](4,5)

Я понимаю, что выбранное неявное преобразование объявлено первым, но есть ли способ указать использование Cylinder один?

1 Ответ

4 голосов
/ 27 июня 2019

Попробуйте объединить RectangleMaker и CylinderMaker в один ShapeMaker неявный класс, например,

implicit class ShapeMaker[T](width: T) {
  def x(height: T)(implicit ev: T =:= Int) = Rectangle(width, height)
  def x(height: T) = Cylinder[T](width, height)
}

и приведите описания типов для определений значений, например

val myRectangle: Rectangle = 3 x 4
val myCircle = 3 c
val myCylinder: Cylinder[Int] = 4 x 5

который выводит

myRectangle = Rectangle(3,4)
myCircle = Circle(3)
myCylinder = Cylinder(4,5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...