2014-04-30 19 views
5

Scala 2.10.4 bu derlerScala 2.11 Tip Varyans değişiklikler

kontravaryant tipi U tipi U değişmez pozisyonunda meydana gelir tip Ters özelliği Foo [-U, T] {türü Contra = U}

bir çözüm mevcut var mı? Bir Scala kütüphanesi üzerinden 2.11'e ve tersine çevirme türüne geçmek için, derleyici tarafından algılanan örtülü kusurların bir tekne yükünün elde edilmesi (yani, U değişmezinin bir seçenek olmaması) gerekir.

Teşekkür

+1

Eğer örtülü çözünürlüğü kontrol tipi üyesi ve contravariance nasıl kullandığını görmek açıklayabilir misiniz? Bu konuda daha fazla bilgi sahibi olmak isterdim ve belki de sorunun derinliklerinde bir çözüm var. – wingedsubmariner

+0

'Contra> türünü kullanabilir misiniz: U'? –

+0

@ n.m. Contra>: U'yu U'yu bir U ve bir U tipi (yani bu yaklaşım derleyicisini denerken X yönteminin Contra'nın bir üyesi olmadığını söyleyerek patlatır) beklemesine dayanan örnekler olarak kullanamıyorum. – virtualeyes

cevap

4

Uygun etrafında bir eser olmanın orada düşünemiyorum. Bunların hepsinin yolu bağımlı türlerini destekleme konusunda olduğunu söylemek nedeni:

def foo[T <: Foo[A,B]](that: T): that.Contra 

yanlış konumda Contra türünü yerleştirir. Bir işlemin sonucu olarak bir kontravaryant türü döndüremezsiniz. Belki de bunların araştırılması ve doğrulanması, derleyici yazarlarının bu küçük köşe kasasına çok fazla yük getirdiğine karar vermesini gerektirir. veya, ortaya çıkardığınız bir derleyici böceğidir. Bu arada, bu sadece benim tarafımdaki vahşi spekülasyonlardır. Hangi yol olduğunu bulmak için derleyici kodunu okumalıyım.

+0

+1'e özgü metodları/özellikleri bilmez, 2.11'deki değişikliği onaylar.Ayrıntılar için cevabımdaki bağlantılı hata iş parçacığına bakın. – virtualeyes

4

Tip denetçisinde 2,7 ve 2,12 öncesi this was a bug görünüyor. Şimdi OP yaklaşımın önlenmesi tür

geçici çözüm biri yaptığı gibi yapmaktır

o_O öncesi 2.11, fark olmanın şimdi sen biliyorum, iyi bir şeydir bir özelliktir kendi başına, derleyicinin senin sırtını aldığını düşündüğün yerlerden önce.

Cehalet mutluluktur, değil mi?

geçici çözüm:

import annotation.unchecked._ 
trait Foo[-U,T]{ 
    type Contra = (U @uncheckedVariance) 
}