0

I have this code:

public interface Interface1{
  void interfaceMethod1();
}

public class Class1<T extends Class0&Interface1>{
 private T field;

 public T getField(){
     return field;
 }
}

When I invoke class1.getField().interfaceMethod1(), where class1 is Class1 instance, I see error "Cannot resolve method".

I want to define class with generic field which will include methods from Class0 and Interface1.

dr_yand
  • 171
  • 2
  • 11

1 Answers1

4

Assume we have next definitions:

public interface Interface1 {
    void interfaceMethod1();
}

public class Class0 {

}
public class Class2 extends Class0 implements Interface1 {
    @Override
    public void interfaceMethod1() {

    }
}

public class Class1<T extends Class0 & Interface1> {
    private T field;

    public T getField() {
        return field;
    }
}

When you have

    Class1 class1 = new Class1();
    class1.getField().interfaceMethod1();

it is called type erasure. It means all generic arguments assumed to be Object, so class1.getField() return Object which lack of interfaceMethod1 method.

To fix that you should do this:

    Class1<Class2> class1 = new Class1<>();
    class1.getField().interfaceMethod1();

Now everything compiles fine.

talex
  • 17,973
  • 3
  • 29
  • 66