Penso che tu stia correndo una limitazione del sistema di inferenza di tipo. Per far luce su questo, diamo un'occhiata a cosa succede quando ridefiniamo questo un po 'per ottenere un output più utile:
class Bar[F[_], A](x: F[A], y: F[A]) {}
res0: Bar[List,Int] = [email protected]
new Bar(List(1,2,3), List(1))
res1: Bar[Any,Int] = [email protected]
new Bar(List(1), 1)
res2: Bar[Any,Int] = [email protected]
new Bar(List(1), Some(1))
<console>:12: error: inferred kinds of the type arguments (Product with java.io.Serializable,Int) do not conform to the expected kinds of the type parameters (type F,type A) in class Bar.
Product with java.io.Serializable's type parameters do not match type F's expected parameters:
<refinement of Product with java.io.Serializable> has no type parameters, but type F has one
new Bar(List(1), Some(1))
^
<console>:12: error: type mismatch;
found : List[Int]
required: F[A]
new Bar(List(1), Some(1))
^
<console>:12: error: type mismatch;
found : Some[Int]
required: F[A]
new Bar(List(1), Some(1))
Nel primo esempio, abbiamo un Bar[List, Int]
, che ha perfettamente senso, siamo passati in due List[Int]
.
Nel secondo e terzo, abbiamo un Bar[Any, Int]
. Ecco dove diventa strano. Ricordare che Any
è l'elemento principale di entrambi gli AnyVal
(il genitore degli equivalenti di Scala delle primitive di Java) e AnyRef
(l'equivalente di Scala dell'oggetto Java) (vedere Scala Documentation per ulteriori spiegazioni).
di Scala inferenza di tipo ha deciso che questo costruttore Bar
s' dovrebbe accettare Any
per F
e Int
per A
. Come Any
è in effetti un genitore di List
e Int
, va bene. Il è infatti parametrizzato come [Int]
, quindi va bene. La cosa strana è che Scala va bene dicendo che lo Int
è anche di tipo Any[Int]
. Non ho una buona spiegazione per quella parte.
Con l'ultimo, è dove sono sinceramente confuso, e devo chiedermi se questo è un bug. Per qualche motivo, anche se sia sia Some
sono figli di Any
ed entrambi sono parametrizzati con Int
, non lo consente. Ho paura che non sono esperto nelle complessità di metodi di inferenza del compilatore, ma per quello che vale, specificare in modo esplicito i parametri funziona:
new Bar[Any,Int](List(1), Some(1))
res14: Bar[Any,Int] = [email protected]
Per me, che suggerisce il sistema di inferenza di tipo solo puo' t dedurre correttamente i tipi, o si tratta di tipi che non sono corretti.
Sia '' Any' e Nothing' sono tipo polimorfo-veda per es [SI-9248] (https://issues.scala-lang.org/browse/SI-9248). –
btw 'bar (1, List (1))' non compila in '2.9', ma in' 2.10'. – dmitry