Fixed
Status Update
Comments
yb...@google.com <yb...@google.com> #2
that is a bug. we should be able to resolve it properly.
yb...@google.com <yb...@google.com> #3
interesting, this works fine if the generic field is public final but does not work w/ getters setters.
yb...@google.com <yb...@google.com> #4
ok, turns out we are not properly processing methods when processing pojos.
That is why it works when I use a field.
I've created a CL that fixes the problem. Until it is shipped, you can workaround the problem by making that field public (preferably public final if possible).
Thanks for the report.
That is why it works when I use a field.
I've created a CL that fixes the problem. Until it is shipped, you can workaround the problem by making that field public (preferably public final if possible).
Thanks for the report.
rm...@gmail.com <rm...@gmail.com> #6
Thanks!!!
jo...@gmail.com <jo...@gmail.com> #7
I may have made another mistake, but using @Embedded on the generic type doesn't seem to work for me. Sounds like it could be related to the fix. Do I open another bug for that one?
jo...@gmail.com <jo...@gmail.com> #8
Oops, submitted before attaching the example. Here it is:
public class BaseEntity<T extends BaseEmbeddedType> {
@Embedded
public T embeddedType;
}
Am I wrong in expecting this to work? It fails with an IllegalArgumentException in the Room processor:
Caused by: java.lang.IllegalArgumentException
at com.google.auto.common.MoreElements$2.defaultAction(MoreElements.java:95)
at com.google.auto.common.MoreElements$2.defaultAction(MoreElements.java:93)
at com.sun.tools.javac.code.Symbol$TypeVariableSymbol.accept(Symbol.java:821)
at com.google.auto.common.MoreElements.asType(MoreElements.java:125)
at com.google.auto.common.MoreTypes.asTypeElement(MoreTypes.java:541)
at android.arch.persistence.room.processor.PojoProcessor.processEmbeddedField(PojoProcessor.kt:367)
at android.arch.persistence.room.processor.PojoProcessor.doProcess(PojoProcessor.kt:150)
at android.arch.persistence.room.processor.PojoProcessor.access$doProcess(PojoProcessor.kt:73)
at android.arch.persistence.room.processor.PojoProcessor$process$1.invoke(PojoProcessor.kt:104)
at android.arch.persistence.room.processor.PojoProcessor$process$1.invoke(PojoProcessor.kt:73)
at android.arch.persistence.room.processor.cache.Cache$Bucket.get(Cache.kt:46)
at android.arch.persistence.room.processor.PojoProcessor.process(PojoProcessor.kt:101)
at android.arch.persistence.room.processor.EntityProcessor.doProcess(EntityProcessor.kt:68)
at android.arch.persistence.room.processor.EntityProcessor.access$doProcess(EntityProcessor.kt:50)
at android.arch.persistence.room.processor.EntityProcessor$process$1.invoke(EntityProcessor.kt:57)
at android.arch.persistence.room.processor.EntityProcessor$process$1.invoke(EntityProcessor.kt:50)
at android.arch.persistence.room.processor.cache.Cache$Bucket.get(Cache.kt:46)
at android.arch.persistence.room.processor.EntityProcessor.process(EntityProcessor.kt:56)
at android.arch.persistence.room.processor.DatabaseProcessor.processEntities(DatabaseProcessor.kt:248)
at android.arch.persistence.room.processor.DatabaseProcessor.doProcess(DatabaseProcessor.kt:63)
at android.arch.persistence.room.processor.DatabaseProcessor.process(DatabaseProcessor.kt:53)
at android.arch.persistence.room.RoomProcessor$DatabaseProcessingStep.process(RoomProcessor.kt:57)
at com.google.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:318)
at com.google.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:171)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
at com.sun.tools.javac.main.Main.compile(Main.java:523)
... 52 more
public class BaseEntity<T extends BaseEmbeddedType> {
@Embedded
public T embeddedType;
}
Am I wrong in expecting this to work? It fails with an IllegalArgumentException in the Room processor:
Caused by: java.lang.IllegalArgumentException
at com.google.auto.common.MoreElements$2.defaultAction(MoreElements.java:95)
at com.google.auto.common.MoreElements$2.defaultAction(MoreElements.java:93)
at com.sun.tools.javac.code.Symbol$TypeVariableSymbol.accept(Symbol.java:821)
at com.google.auto.common.MoreElements.asType(MoreElements.java:125)
at com.google.auto.common.MoreTypes.asTypeElement(MoreTypes.java:541)
at android.arch.persistence.room.processor.PojoProcessor.processEmbeddedField(PojoProcessor.kt:367)
at android.arch.persistence.room.processor.PojoProcessor.doProcess(PojoProcessor.kt:150)
at android.arch.persistence.room.processor.PojoProcessor.access$doProcess(PojoProcessor.kt:73)
at android.arch.persistence.room.processor.PojoProcessor$process$1.invoke(PojoProcessor.kt:104)
at android.arch.persistence.room.processor.PojoProcessor$process$1.invoke(PojoProcessor.kt:73)
at android.arch.persistence.room.processor.cache.Cache$Bucket.get(Cache.kt:46)
at android.arch.persistence.room.processor.PojoProcessor.process(PojoProcessor.kt:101)
at android.arch.persistence.room.processor.EntityProcessor.doProcess(EntityProcessor.kt:68)
at android.arch.persistence.room.processor.EntityProcessor.access$doProcess(EntityProcessor.kt:50)
at android.arch.persistence.room.processor.EntityProcessor$process$1.invoke(EntityProcessor.kt:57)
at android.arch.persistence.room.processor.EntityProcessor$process$1.invoke(EntityProcessor.kt:50)
at android.arch.persistence.room.processor.cache.Cache$Bucket.get(Cache.kt:46)
at android.arch.persistence.room.processor.EntityProcessor.process(EntityProcessor.kt:56)
at android.arch.persistence.room.processor.DatabaseProcessor.processEntities(DatabaseProcessor.kt:248)
at android.arch.persistence.room.processor.DatabaseProcessor.doProcess(DatabaseProcessor.kt:63)
at android.arch.persistence.room.processor.DatabaseProcessor.process(DatabaseProcessor.kt:53)
at android.arch.persistence.room.RoomProcessor$DatabaseProcessingStep.process(RoomProcessor.kt:57)
at com.google.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:318)
at com.google.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:171)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
at com.sun.tools.javac.main.Main.compile(Main.java:523)
... 52 more
Description
Version used: 1.0.0 and 1.1.0 alpha2
Devices/Android versions reproduced on: Android Studio 3.1 Beta 3
0
down vote
favorite
I'm trying to have a base class which id field is of a generic type like
class BaseEntity<T>{
private T id;
//get, set;
}
class User extends BaseEntity<String> {
//blah blah blah
}
and I have a DAO like this:
@Dao
public interface UserDao {
@Query("SELECT * FROM user WHERE id = :id")
Flowable<User> getUserById(String id);
}
and I get a compilation error:
app\build\generated\source\apt\irrisimples\debug\com\irrisimples\data\source\local\UserDao_Impl.java:275: error: cannot find symbol final T _tmpId; ^
and in UserDao_Impl:275:
final T _tmpId; _tmpId = _cursor.getString(_cursorIndexOfId);
So this means that Room couldn't figure out what was T and replace the value there. Is it a bug or am I doing something wrong?
related question on S.O.: