Index: src/test/gls/generics/vm5/GenericsTest.groovy
===================================================================
--- src/test/gls/generics/vm5/GenericsTest.groovy	(revision 10251)
+++ src/test/gls/generics/vm5/GenericsTest.groovy	(working copy)
@@ -229,4 +229,52 @@
         assert task.call() == "x"
       """  
 	}
+
+    void testCovariantReturnWithInterfaceSubclass() {
+      assertScript """
+        import java.util.concurrent.*
+
+        abstract class AbstractCallableTask<T> implements Callable<T> {
+        } 
+
+        class CallableTask extends AbstractCallableTask<String> {
+          public String call() { "x" }
+        } 
+        
+        def task = new CallableTask()
+        assert task.call() == "x"
+      """  
+
+      assertScript """
+        import java.util.concurrent.*
+
+        abstract class AbstractCallableTask<T> implements Callable<T> {
+        } 
+
+        abstract class SubclassCallableTask<T> extends AbstractCallableTask<T> {
+        } 
+
+        class CallableTask extends SubclassCallableTask<String> {
+          public String call() { "x" }
+        } 
+        
+        def task = new CallableTask()
+        assert task.call() == "x"
+      """  
+
+      shouldNotCompile """
+        import java.util.concurrent.*
+
+        abstract class AbstractCallableTask<T> implements Callable<T> {
+        } 
+
+        // XXX: T is not bound, so why is String allowed
+        class CallableTask extends AbstractCallableTask<T> {
+          public String call() { "x" }
+        } 
+        
+        def task = new CallableTask()
+        assert task.call() == "x"
+      """  
+    }
 }

