Ce face mai exact 'este mai specifică decât în contextul implicits?

0

Problema

Deci, implicit prioritate se bazează pe doi factori: unul este despre domeniul de aplicare de declarația în sine având prioritate (aplicare Un extinde domeniul de aplicare/trăsătură B, sau domeniul de aplicare fiind un companion obiect de un tip extins de la un tip cu domeniu de aplicare B ca partenerul obiect). Celelalte pur și simplu menționează că declarația este mult mai specific decât declarația B. Acum, când a citit-o pentru prima dată am avut mai multe interpretări posibile în minte, mai ales având în vedere potențialul de parametri (implicit și nu) a implicit metoda și tipul de parametri. Experiența părea să mă învețe că aceasta înseamnă că tipul de valoarea returnată de O declarație, după toate tip de inferență/tapply, este un subtip de retur tip de declarație B. Deci, acest lucru este bine:

  class A
  class B extends A
  implicit val A = new A
  implicit val B = new B
  implicitly[A]

De ce acest lucru nu a compila, atunci?

    implicit class A(val toInt :Int) {
        def ! = (1 /: (2 to toInt))(_ * _)
    }
    implicit class B(i :Int) extends A(i)
    1.!

Atunci când acest lucru?

    class A(val toInt :Int) {
        def ! = (1 /: (2 to toInt))(_ * _)
    }
    class B(i :Int) extends A(i)

    implicit val A = { i :Int => new A(i) }
    implicit val B = { i :Int => new B(i) }
    1.!

Este un alt caz de compilator lucrează în moduri misterioase'?

implicit implicit-conversion scala
2021-11-14 19:33:24
1

Cel mai bun răspuns

2

Bazat pe SIP-13 - IMPLICIT CLASE propunerea ta declarație:

implicit class A(val toInt :Int) {
    def ! = (1 /: (2 to toInt))(_ * _)
}

Va fi transformat în ceva de genul:

class A(toInt: Int) {
 ...
}
implicit final def A(toInt: Int): A = new A(toInt);

Și B la rândul său, va fi transformat în ceva de genul:

class B(i: Int) extends A(i) {
 ...
}
implicit final def B(i: Int): B = new B(i);

Practic, declararea 2 conversia implicită metode cu aceeași parametri care sunt ambigue. În timp ce ultima nu este ambiguă din cauza menționat deja "mai specifice" regula implicită a parametrilor de rezoluție.

2021-11-14 20:25:04

Mi-e teamă că nu înțeleg de ce ultima nu este ambiguă. Implicit metoda se reifică să o functie implicita (în Scala 2), deci nu vad unde exact diferența constă, semantic. De asemenea, dacă am pus implicit clasa declarații în diferite contexte, dar apoi importați-le (astfel încât acestea sunt borh de identificare disponibile în local sintactice context fără prefixarea), de exemplu faptul că nu funcționează: stackoverflow.com/questions/69966645/...
Turin

@Torino "mă tem că nu înțeleg de ce ultima nu este ambiguă." - este în conformitate cu regulile pe care le-am menționat în întrebare (rezoluție de parametrii impliciți). Și primul este similară cu selectarea metodei de suprasarcină bazate pe tipuri de parametri. Vedea, de asemenea, răspunsurile la această întrebare, ta soluție este menționat acolo..
Guru Stron

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................