Daniel Wellman
2008-12-02 01:21:25 UTC
It looks like PicoContainer 2 from trunk does not allow specifying
BasicComponentParameters when the target parameter has a
generic/parameterized type. The following code example produces this
ClassCastException:
java.lang.ClassCastException:
sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
at
org.picocontainer.parameters.BasicComponentParameter.resolveInstance(BasicComponentParameter.java:161)
at
org.picocontainer.injectors.SingleMemberInjector.getParameter(SingleMemberInjector.java:67)
at
org.picocontainer.injectors.SingleMemberInjector.getMemberArguments(SingleMemberInjector.java:53)
at
org.picocontainer.injectors.ConstructorInjector.getMemberArguments(ConstructorInjector.java:240)
at
org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:199)
at
org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:289)
at
org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:229)
at
org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:573)
at
org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:537)
at
org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:514)
at
com.bostoncapital.stuyvesant.picocontainer.PicoAcceptanceTest.testCannot_Use_BasicComponentParameter_with_Generic_Type(PicoAcceptanceTest.java:152)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
Here's the example:
public void testCannot_Use_BasicComponentParameter_with_Generic_Type() {
DefaultPicoContainer pico = new DefaultPicoContainer();
pico.addComponent(FictionFactory.class);
pico.addComponent(NonFictionFactory.class);
pico.addComponent("bookHelperUsingFiction", BookHelper.class, new
BasicComponentParameter(FictionFactory.class));
// This throws a java.lang.ClassCastException:
sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
Object component = pico.getComponent("bookHelperUsingFiction");
assertNotNull(component);
}
public static class BookHelper {
BookFactory factory;
// The test above passes if BookFactory does not have a parameterized
type, e.g.
// if it's publicBookHelper(BookFactory newFactory) { ... }
public BookHelper(BookFactory newFactory) {
this.factory = newFactory;
}
}
public static interface BookFactory {
T build();
}
public static class FictionFactory implements BookFactory {
public Fiction build() {
return new Fiction();
}
}
public static class NonFictionFactory implements BookFactory {
public NonFiction build() {
return new NonFiction();
}
}
static class Fiction {
}
static class NonFiction {
}
BasicComponentParameters when the target parameter has a
generic/parameterized type. The following code example produces this
ClassCastException:
java.lang.ClassCastException:
sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
at
org.picocontainer.parameters.BasicComponentParameter.resolveInstance(BasicComponentParameter.java:161)
at
org.picocontainer.injectors.SingleMemberInjector.getParameter(SingleMemberInjector.java:67)
at
org.picocontainer.injectors.SingleMemberInjector.getMemberArguments(SingleMemberInjector.java:53)
at
org.picocontainer.injectors.ConstructorInjector.getMemberArguments(ConstructorInjector.java:240)
at
org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:199)
at
org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:289)
at
org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:229)
at
org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:573)
at
org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:537)
at
org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:514)
at
com.bostoncapital.stuyvesant.picocontainer.PicoAcceptanceTest.testCannot_Use_BasicComponentParameter_with_Generic_Type(PicoAcceptanceTest.java:152)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
Here's the example:
public void testCannot_Use_BasicComponentParameter_with_Generic_Type() {
DefaultPicoContainer pico = new DefaultPicoContainer();
pico.addComponent(FictionFactory.class);
pico.addComponent(NonFictionFactory.class);
pico.addComponent("bookHelperUsingFiction", BookHelper.class, new
BasicComponentParameter(FictionFactory.class));
// This throws a java.lang.ClassCastException:
sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
Object component = pico.getComponent("bookHelperUsingFiction");
assertNotNull(component);
}
public static class BookHelper {
BookFactory factory;
// The test above passes if BookFactory does not have a parameterized
type, e.g.
// if it's publicBookHelper(BookFactory newFactory) { ... }
public BookHelper(BookFactory newFactory) {
this.factory = newFactory;
}
}
public static interface BookFactory {
T build();
}
public static class FictionFactory implements BookFactory {
public Fiction build() {
return new Fiction();
}
}
public static class NonFictionFactory implements BookFactory {
public NonFiction build() {
return new NonFiction();
}
}
static class Fiction {
}
static class NonFiction {
}
--
View this message in context: http://www.nabble.com/BasicComponentParameter-doesn%27t-work-with-parameterized-types-tp20784248p20784248.html
Sent from the NanoContainer - PicoContainer - Users mailing list archive at Nabble.com.
View this message in context: http://www.nabble.com/BasicComponentParameter-doesn%27t-work-with-parameterized-types-tp20784248p20784248.html
Sent from the NanoContainer - PicoContainer - Users mailing list archive at Nabble.com.