I used the Scala 2.0 interpreter...



class Up {}



class Middle extends Up {}



class Bottom extends Middle {}



class Top { def cv(t: Up) = "Top"; def inv(m: Middle) = "Top"; def ctv(b: Bottom) = "Top"; }



class Down extends Top {def cv(m: Middle) = "Down";override def inv(m: Middle) = "Down"; def ctv(m: Middle) = "Down";}



def testcv1(t: Top) = {Console.println(t.cv(new Up()));Console.println(t.cv(new Middle()));Console.println(t.cv(new Bottom()));} 

def testcv2(d: Down) = {Console.println(d.cv(new Up())); Console.println(d.cv(new Middle())); Console.println(d.cv(new Bottom()));} 



def testinv1(t: Top) = {Console.println("type mismatch; found : Up required: Middle");Console.println(t.inv(new Middle()));Console.println(t.inv(new Bottom()));} 

def testinv2(d: Down) = {Console.println("type mismatch; found : Up required: Middle");Console.println(d.inv(new Middle()));Console.println(d.inv(new Bottom()));} 



def testctv1(t: Top) = {Console.println("type mismatch; found : Up required: Bottom");Console.println("type mismatch; found : Middle required: Bottom") ;Console.println(t.ctv(new Bottom()));} 

def testctv2(d: Down) = {Console.println("type mismatch; found : Up required: Bottom");Console.println(d.ctv(new Middle()));Console.println("ambiguous reference to overloaded definition, both method ctv in class Down of type (line2$object.Middle)java.lang.String and  method ctv in class Top of type (line3$object.Bottom)java.lang.String match argument types (line3$object.Bottom) and expected result type scala.Any"); }



-- run

scala> Console.println("First column");

testcv1(new Top());

testinv1(new Top());

testctv1(new Top());

Console.println("Second column");

testcv2(new Down());

testinv2(new Down());

testctv2(new Down());

Console.println("Third column");

testcv1(new Down());

testinv1(new Down());

First column

line15: scala.Unit = ()



scala> Top

Top

Top

line16: scala.Unit = ()



scala> type mismatch; found : Up required: Middle

Top

Top

line17: scala.Unit = ()



scala> type mismatch; found : Up required: Bottom

type mismatch; found : Middle required: Bottom

Top

line18: scala.Unit = ()



scala> Second column

line19: scala.Unit = ()



scala> Top

Down

Down

line20: scala.Unit = ()



scala> type mismatch; found : Up required: Middle

Down

Down

line21: scala.Unit = ()



scala> type mismatch; found : Up required: Bottom

Down

ambiguous reference to overloaded definition, both method ctv in class Down of t

ype (line2$object.Middle)java.lang.String and  method ctv in class Top of type (

line3$object.Bottom)java.lang.String match argument types (line3$object.Bottom)

and expected result type scala.Any

line22: scala.Unit = ()



scala> Third column

line23: scala.Unit = ()



scala> Top

Top

Top

line24: scala.Unit = ()



scala> type mismatch; found : Up required: Middle

Down

Down

line25: scala.Unit = ()



scala> testctv1(new Down());

type mismatch; found : Up required: Bottom

type mismatch; found : Middle required: Bottom

Top

line26: scala.Unit = ()



scala>