2014-07-12 37 views
5

Ben şu durum sınıfı:T [A <: C [U], B <: C [U], U] T [A, B] olarak kullanılabilecek genel bir tip oluşturmak mümkün mü?

type Area[T] = Length[T] <*> Length[T] 

Ancak, ben <*> üç parametre bekler ve sadece verdik belirten bir hata alıyorum:

case class <*>[Q <: Quantity[T], R <: Quantity[T], T](value: T) 
    extends Quantity[T] 

ben bu şekilde kullanmak istiyorum iki. Ben böyle çalışmak istiyorum:

type Area[T] = <*>[Length[T], Length[T], T] 

Denedim aşağıdaki fakat bana bir hata verdi:

trait Quantity[T] { 
    type Value = T 

    def value: T 
} 

case class <*>[Q <: Quantity[_], 
       R <: Quantity[_]](value: Q#Value) 
           (implicit eq: Q#Value =:= R#Value) 
    extends Quantity[Q#Value] 

Error:(13, 110) illegal inheritance;
self-type <*>[Q,R] does not conform to Quantity[_$1] 's selftype Quantity[_$1]

case class <*>[Q <: Quantity[_], 
       R <: Quantity[_]](value: Q#Value) 
           (implicit eq: Q#Value =:= R#Value) 
    extends Quantity[Q#Value] 
^

bir çözüm bunun için var mı? Gerekirse, iyi infix sözdizimini istememe rağmen vaka sınıflarını yeniden adlandırmaya gerek yok.

+0

@Kigyo, derleme yapmaz. T türü hala bilinmiyor – wedens

+0

@wedens Haklısınız. Repl'de farklı bir şey girmiş olmalıyım. Teşekkürler. – Kigyo

+0

Eski bir soru olduğunu biliyorum, ancak ilk Miktar [_] ve ikincisinin farklı türler olarak kabul edilmesi sorun değil (aynı kapsamda _ $ 1 farklı kapsamda kullanılır)? Sanırım başıma birkaç kez geldim. – Governa

cevap

1

Sorun, Q#Value referansıdır.

Ben senin tipin kısıtlamaları uygulamak için örtük kullanarak yerine existentials çalışması yapmaya çalışıyorum öneririm:

sealed trait CanStar[Q, R] 
// could include =:=-like values in CanStar if you like 
object CanStar { 
    implicit def canStar[Q <: Quantity[T], R <: Quantity[T], T] = 
    new CanStar[Q, R]{} 
} 

sealed case class <*>[Q,R](value: Q)(implicit cs: CanStar[Q, R]) 

Sonra <*> istediğiniz gibi iki parametre türüdür, ancak sadece şimdiye kadar Q <*> R örnek oluşturabilirsiniz Uygun bir şekilde ilişkili olan Q ve R sayılı belgelerde belirtildiği gibi (dolayısı ile CanStar[Q, R] s için uygun Q ve R mevcuttur).

+0

Sorun, 'değerin' Q' türünden değil, 'T' tipinde olması gerektiğidir. – rightfold

+1

Bu durumda 'value: Any' ve' cs: CanStar [Q, R, value.type] '? – lmm

İlgili konular