Ok, got it! Thanks Miles!
But Classifier also needs to be contravariant it T. I assume you just
forgot to change + to - Miles, right?
trait Classifier[-T] {
def classify[U <: T](t: U): String
}
Am 09.07.2009 um 18:20 schrieb Christoph Drießen:
> Hi Miles,
> page 396 of Programming in Scala says: " U >: T defines T as the
> lower bound for U". So U must be a supertype of T. In that way
> you're right and that's how I understand it. But how is it possible
> to pass in a String? String isn't a supertype of Aa.
>
> The change you've suggested does not compile:
> covariant type T occurs in contravariant position in type >:
> scala.this.Nothing <: T of type U&0
> def classify[U <: T](t: U): String
>
> Cheers,
> Christoph
>
>
>
> Am 09.07.2009 um 16:31 schrieb Miles Sabin:
>
>> On Thu, Jul 9, 2009 at 3:23 PM, Christoph Drießen<
ced@...> wrote:
>>> can anyone explain to me why the following code compiles? As I
>>> understand
>>> it, Aa acts as the lower bound in the implementation of classify
>>> in class
>>> AaClassifier and so I wonder why I'm able to pass in a String.
>>
>> You've got your bounds the wrong way around: that's an upper bound,
>> so
>> T can be instantiated to the supertypes of Aa which are Any, AnyRef
>> etc.
>>
>> What I think you want is,
>>
>> trait Classifier[+T] {
>> def classify[U <: T](t: U): String
>> }
>>
>> class AaClassifier extends Classifier[Aa] {
>> def classify[T <: Aa](t: T) = t.toString
>> }
>>
>> Cheers,
>>
>>
>> Miles
>>
>> --
>> Miles Sabin
>> tel: +44 (0)7813 944 528
>> skype: milessabin
>>
http://www.chuusai.com/>>
http://twitter.com/milessabin>>
>