How to define a implicit (given) Conversion for Generic Types?

62 Views Asked by At

I want to use the Scala 3 Implicit Conversion.

I have the following construct that I want to migrate:

  implicit def toTesterObjectScenario[In <: Product](
                                   decisionDmn: DecisionDmn[In, _]
                                ): DmnTesterObject[In] =
    DmnTesterObject(decisionDmn, defaultDmnPath(decisionDmn.decisionDefinitionKey))

I tried:

  given Conversion[DecisionDmn[_ <: Product, _], DmnTesterObject[_ <: Product]] with
    def apply(decisionDmn: DecisionDmn[_ <: Product, _]): DmnTesterObject[_ <: Product] =
      DmnTesterObject(decisionDmn, defaultDmnPath(decisionDmn.decisionDefinitionKey))

This compiles but does not work when running:

Exception in thread "main" java.lang.NoSuchMethodError: 'camundala.dmn.DmnTesterConfigCreator$DmnTesterObject camundala.dmn.DmnTesterConfigCreator.toTesterObjectScenario$(camundala.dmn.DmnTesterConfigCreator, camundala.bpmn.DecisionDmn)'
    at valiant.bpmn.dmn.BpmnDmnTester$.toTesterObjectScenario(BpmnDmnTester.scala:11)

This does not even compile:

  given Conversion[DecisionDmn[_ <: Product, _], DmnTesterObject[_ <: Product]] with
    def apply[In <: Product](decisionDmn: DecisionDmn[In, _]): DmnTesterObject[In] =
      DmnTesterObject(decisionDmn, defaultDmnPath(decisionDmn.decisionDefinitionKey))

Is this not possible or how it is done?

1

There are 1 best solutions below

0
Adrien Piquerez On BEST ANSWER

You need a given instance of type Conversion[DecisionDmn[In, _], DmnTesterObject[In] where In <: Product.

This is how you can add a type parameter to a given instance:

given [In <: Product]: Conversion[DecisionDmn[In, _], DmnTesterObject[In]] with
  def apply(decisionDmn: DecisionDmn[In, _]): DmnTesterObject[In] = ???