You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by "Paul Field (JIRA)" <ji...@apache.org> on 2009/05/29 17:54:45 UTC

[jira] Created: (TAP5-729) Tapestry IOC proxies have incorrect implementation when interface method uses a covariant return type (causes AbstractMethodError)

Tapestry IOC proxies have incorrect implementation when interface method uses a covariant return type (causes AbstractMethodError)
----------------------------------------------------------------------------------------------------------------------------------

                 Key: TAP5-729
                 URL: https://issues.apache.org/jira/browse/TAP5-729
             Project: Tapestry 5
          Issue Type: Bug
          Components: tapestry-ioc
    Affects Versions: 5.1.0.5
            Reporter: Paul Field


Here's a Junit 3 test case to demonstrate:


import junit.framework.TestCase;

import org.apache.tapestry5.ioc.Registry;
import org.apache.tapestry5.ioc.RegistryBuilder;
import org.apache.tapestry5.ioc.ServiceBinder;


public class ProxyText extends TestCase {

    private Registry registry;

    @Override
    protected void setUp() throws Exception {
        RegistryBuilder builder = new RegistryBuilder();
        builder.add(AppModule.class);
        registry = builder.build();
        registry.performRegistryStartup();
    }

    public void testRegistryWorks() {
        assertEquals(new Integer(1), registry.getService(SuperIFace.class).get());
    }

    public static class AppModule {
        public static void bind(ServiceBinder binder) {
            binder.bind(IFace.class, Impl.class);
        }
    }

    public interface SuperIFace {
        Number get();
    }

    public interface IFace extends SuperIFace {
        Integer get();
    }


    public static class Impl implements IFace {
        public Integer get() {
            return 1;
        }
    }
}



----- 
The result is:
java.lang.AbstractMethodError: $IFace_1218d10684a.get()Ljava/lang/Number;

Note that if you change SuperIFace to:
    public interface SuperIFace {
        Integer get();
    }
the test works - demonstrating that the problem is to do with the use of a covariant return type in IFace.


BTW, this has turned up in code for testing where I want to create sub-interfaces that provide additional testing facilities for fake services and I need to control the particular types that are returned by the fake implementation.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.