Birbirine bağlı olmak üzere tasarlanmış iki sınıfım var, Input
ve Output
. Output
, bazı türlerde değerler üretir ve Input
bunları tüketir.Scala bu örnekte neden parametre kullanamıyor?
class Input[T] {
var output: Option[Output[_ <: T]] = None
}
class Output[T] {
var input: Option[Input[_ >: T]] = None
}
bir Input
ve Output
çifti sürece Input
tür parametresi Output
tip parametrenin bir üst tip olarak değerinin aynı tür üzerinde işlem yoksa sorun değil. Her iki sınıftaki tür parametresinin değişmez olduğunu unutmayın; Gerçek versiyonlarda hem ko- hem de kontravaryant pozisyonlarda kullanılır.
val out = new Output[String]
val in = new Input[AnyRef]
connect(out, in)
: Ben aşağıda bu yöntemi çağırırsanız, bir tür hatası aldığınız
def connect[T](output: Output[T], input: Input[_ >: T]) = {
output.input = Some(input)
input.output = Some(output)
}
:
BirInput
/
Output
çifti arasında bir bağlantı kurar başka yerde bir
connect
yöntemine sahip Hata:
test.scala:17: error: type mismatch;
found : Output[String]
required: Output[AnyRef]
connect(out, in)
^
Yapabilirim Bunu tür parametresi yazarak çöz (bu durumda, connect[String]
yazabilirim, ama derleyicinin bunu benim için çözmesi gerektiğini düşünüyorum). Tür parametresi otomatik olarak çıkacak şekilde connect
yöntemini nasıl değiştirebilirim?
Düzenleme: Şimdilik, ben connect
Output
bir yöntem bu yüzden türü parametresi otomatik alır hale getirdik. Bu aynı zamanda out connect in
infix notasyonunu kullanabileceğim ek faydaya sahiptir, ancak tasarım biraz garip geliyor.
Derleyicinin bu davranışı neden sergilediğini hala merak ediyorum. Tip parametresini çıkarabilmeli gibi hissediyorum. Bu aslında belirtilen şekilde çalışıyor mu?
"Aynı türde bir değer kullanmayın" * –
sorusunu Scala posta listesine sormayı denediniz mi? – GClaramunt