(aynı zamanda iki ilişkili sorulara bakınız: Scala fails to infer the right type arguments ve Type infered to Nothing in Scala)
O kasıtlı spec'ed değildir Scala'nın tür kesmesi, bir sınırlama gibi görünüyor. bir çözüm olarak, sen T
bir tip üyesi yerine parametrenin daha B
ait yaparak çıkarım alabilirsiniz
abstract class A
abstract class B { type T <: A }
class ConcreteA extends A
class ConcreteB extends B { type T = ConcreteA }
class Example[U <: B](resolver: U)
object Test {
new Example(new ConcreteB)
}
tip üyelerini kullanarak, bunların arıtma kullanarak tipi parametreleri olarak ortaya edilebileceğini bilmek yararlıdır
, Miles Sabin yanıtında olarak:
Why is this cyclic reference with a type projection illegal?
a related question Jean-Philippe pelet cevabı ise
yazın çıkarsama tipi parametresini daha yüksek kinded yaparak destekli edildi. Eğer ConcreteB
fazladan tipi parametresi tanıtmak , o zaman
abstract class A abstract class B[T <: A] class ConcreteA extends A class ConcreteB[T <: A] extends B[T] class Example[T <: A, U[T0 <: A] <: B[T0]](resolver: U[T]) object Test { new Example(new ConcreteB[ConcreteA]) }
Scala 2.9 aşağıda gizemli hata mesajı verir, çıkarsama çalışabilir yazın ancak Miles Sabin 2,9 sabit olacak bir hata olduğunu işaret ediyor. 1 <console>:15: error: kinds of the type arguments (ConcreteA,ConcreteB[T0]) do not conform to the expected kinds of the type parameters (type T,type U) in class Example.
ConcreteB[T0]'s type parameters do not match type U's expected parameters: class ConcreteB has one type parameter, but type U has one
new Example(new ConcreteB[ConcreteA])
^
olası bir kopyası [Scala'da Nothing türüne yazılır] (http://stackoverflow.com/questions/6888136/type-infered-to-nothing-in-scala) –
Benzer, ancak kabul edilen yanıt Bu durumda soru geçerli değildir. –