You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@groovy.apache.org by Jochen Theodorou <bl...@gmx.org> on 2016/08/01 07:57:51 UTC
Re: Undeclared type variable: T when calling a method from a class
with a trait from java
that sounds like a bug in the code generated by the groovy compiler for
the one of the fields you use. Though I remember a bug like this being
fixed... Can you ell us what groovy version you use? Also... that error
message from Java is strangely descriptive. Normally you end up with a
some very cryptic stuff from inside the jdk... could you tell me what
Java version you use as well?
bye Jochen
On 01.08.2016 00:08, abosch wrote:
> Heyho,
>
> I have the following problem, maybe someone can help me here, thx :):
>
> I have a trait, which adds recursive behaviour to a class like a
> DirectoryEntity.
>
> @CompileStatic
> trait RecursiveEntity<T extends RecursiveEntity<T>> extends Entity {
> T successor;
> final List<T> subEntities = new ArrayList<T>();
>
> void setParent(final T newParent) {
> if (successor) {
> successor.removeSubEntity(this as T);
> }
> successor = newParent;
> if (newParent) {
> newParent.addSubEntity(this as T);
> }
> }
>
> void addSubEntity(final T newEntity) {
> Validate.notNull(newEntity)
> def parent = newEntity.successor;
> if (parent) {
> parent.removeSubEntity(newEntity);
> }
> newEntity.successor = this as T;
> subEntities.add(newEntity);
> }
>
> void removeSubEntity(final T toRemove) {
> Validate.notNull(toRemove)
> if (toRemove.successor == this) {
> subEntities.remove(toRemove);
> toRemove.successor = null;
> }
> }
> ...
> }
>
> @CompileStatic
> class DirectoryEntity implements RecursiveDirectoryEntity {
>
> @Delegate
> Container<FileEntity> container = new Container<>()
> ...
> }
>
> If I construct a DirectoryEntity from within Java code and use any method, I
> get following Error message: Error:(13, 24) java: cannot access
> de.unibremen.st.entitygraph.traits.RecursiveEntity$Trait$FieldHelper bad
> class file:
> /home/artur/Arbeit/tools/entitygraph/build/classes/main/de/unibremen/st/entitygraph/traits/RecursiveEntity$Trait$FieldHelper.class
> undeclared type variable: T Please remove or make sure it appears in the
> correct subdirectory of the classpath.
>
> Is there a solution to my problem? I already had to remove multiple trait
> usage and introduce Delegates because java can't handle it.
>
> To just use groovy code is not an option as my coworker's project is plain
> java...
> Big thx you and greets! Artur
>
>
>
> --
> View this message in context: http://groovy.329449.n5.nabble.com/Undeclared-type-variable-T-when-calling-a-method-from-a-class-with-a-trait-from-java-tp5734382.html
> Sent from the Groovy Users mailing list archive at Nabble.com.
>
Re: Undeclared type variable: T when calling a method from a class
with a trait from java
Posted by abosch <ar...@gmx.de>.
The groovy version is 2.4.6 and java is 1.8.0_92 (Oracle).
If i use more than one trait in a class and call its methods from within
java, I get the same error message.
Then i removed multiple traits and only used one with @Delegate. This is
possible in Java, when there is no generic type in the trait e.g.:
@CompileStatic
trait RecursiveDirectoryEntity extends Entity {
DirectoryEntity successor;
final List<DirectoryEntity> subEntities = new ArrayList<>();
...
}
This is allowed, but that not:
trait RecursiveEntity<T extends RecursiveEntity<T>> extends Entity {
T successor;
final List<T> subEntities = new ArrayList<T>();
...
}
greets
--
View this message in context: http://groovy.329449.n5.nabble.com/Undeclared-type-variable-T-when-calling-a-method-from-a-class-with-a-trait-from-java-tp5734382p5734393.html
Sent from the Groovy Users mailing list archive at Nabble.com.