I have a following code:
class A{}
class B{}
class StuffDoer {
  public void doStuff(A a) { System.out.println("A"); }
  public void doStuff(B b) { System.out.println("B"); }
  public void doStuff(Object o) { System.out.println("Object"); }
}
class Test {
  private final StuffDoer stuffDoer;
  public <T> void foo(T t) {
    stuffDoer.doStuff(t)
  }
}
And following execution
Test test = new Test();
A a = new A();
B b = new B();
test.foo(a);
test.foo(b);
prints "Object" twice, instead of expected "A" and "B" afterwards.
It doesn't work if i explicit pass a Class object either
class Test {
  private final StuffDoer stuffDoer;
  public <T> void foo(T t) { //doesnt work
    stuffDoer.doStuff(t.getClass().cast(t))
  }
  public <T> void foo(T t, Class<T> tClass) { //doesnt work either
    stuffDoer.doStuff(tClass.cast(t))
  }
}
It only works if i explicity cast them to proper object in the foo method like this
class Test {
  private final StuffDoer stuffDoer;
  public <T> void foo(T t) {
    if ( t instanceof A ) 
      stuffDoer.doStuff((A) t) // Prints "A"
    else if ( t instance of B ) 
      stuffDoer.doStuff((B) t) // Prints "B"
    else
      stuffDoer.doStuff(t) // Prints "Object"
  }
}
Why is that? How can i achive right method overloading from a generic type? Is it even possible in Java?
 
    