Menu

#318 Google Guice 4.1.0 - Specified cast is not valid

v1.0 (example)
open
nobody
None
5
2017-02-14
2017-02-08
No

Using ikvm 8.1.5717.0 from Debian repository.

We encounter a problem with Guice 4.1.0. Read at [2] that guice should most likely work.

INFORMATION: An exception was caught and reported. Message: java.lang.ClassCastException: Specified cast is not valid.
java.lang.ClassCastException: Specified cast is not valid.
    at com.google.inject.internal.MoreTypes.canonicalizeForKey(MoreTypes.java:104)
    at com.google.inject.Key.<init>(Key.java:137)
    at com.google.inject.Key.get(Key.java:277)
    at com.google.inject.internal.Annotations.getKey(Annotations.java:283)
    at com.google.inject.assistedinject.FactoryProvider2.constructorHasMatchingParams(FactoryProvider2.java:552)
    at com.google.inject.assistedinject.FactoryProvider2.findMatchingConstructorInjectionPoint(FactoryProvider2.java:496)
    at com.google.inject.assistedinject.FactoryProvider2.<init>(FactoryProvider2.java:292)
    at com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder.java:334)
    at com.google.inject.AbstractModule.configure(AbstractModule.java:62)
    at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:340)
    at com.google.inject.AbstractModule.install(AbstractModule.java:122)

This method is the cause of all evil. I wasn't able to create a minimal failure case though.

  public static <T> TypeLiteral<T> canonicalizeForKey(TypeLiteral<T> typeLiteral) {
    Type type = typeLiteral.getType();
    if (!isFullySpecified(type)) {
      Errors errors = new Errors().keyNotFullySpecified(typeLiteral);
      throw new ConfigurationException(errors.getMessages());
    }

    if (typeLiteral.getRawType() == javax.inject.Provider.class) {
      ParameterizedType parameterizedType = (ParameterizedType) type;

      // the following casts are generally unsafe, but com.google.inject.Provider extends
      // javax.inject.Provider and is covariant
      @SuppressWarnings("unchecked")
      TypeLiteral<T> guiceProviderType = (TypeLiteral<T>) TypeLiteral.get(
          Types.providerOf(parameterizedType.getActualTypeArguments()[0]));
      return guiceProviderType;
    }

We are trying to connect a converted jar from C# code. See some code snippets in the mailing list archive [1] linked below.

[1] https://sourceforge.net/p/ikvm/mailman/message/35654368/
[2] http://weblog.ikvm.net/CommentView.aspx?guid=5924f108-3375-4fe7-9809-2939ab1ba85f#commentstart

Discussion

  • Jeroen Frijters

    Jeroen Frijters - 2017-02-08

    Unfortunately I don't have a lot of time to work on IKVM, so without a minimal repro this is unlikely to get investigated/fixed.

     
  • Martin Gerhardy

    Martin Gerhardy - 2017-02-08

    Tested with guice 3.0 - same error - just a different line of code. Will try to assemble a repro - but not that easy...

     
  • Martin Gerhardy

    Martin Gerhardy - 2017-02-14

    Ok, the problem is related to Providers. As ikvm removes the generic information from converted java classes, you can't inject Providers (or any other class with generics) - we worked around that problem by doing a factory that we can inject and not specifying the generic type at all (or better, hide this information in the factory).

    As providers don't have and generics anymore in the ikvm world, the guice cast to ParameterizedType can't work (at least that is my guess)

     

Log in to post a comment.