Olá,
O seu código implementado corretamente, de acordo com o que você passou, seria:
class Shape {
String draw() {
return "Shape.draw().";
}
}
class Rectangle extends Shape {
String draw() {
return super.draw() + "Rectangle.draw().";
}
}
class Square extends Rectangle {
String draw() {
return super.draw() + "Square.draw().";
}
}
class Circle extends Square {
String draw() {
return super.draw() + "Circle.draw().";
}
}
class Triangle extends Circle {
String draw() {
return super.draw() + "Triangle.draw().";
}
}
public class Prova {
private < T extends Shape > String invocarDraw( T obj ) {
return obj.draw();
}
public static void main( String[] args ) {
Prova prova = new Prova();
Shape shape = new Shape();
System.out.println( prova.invocarDraw( shape ) );
shape = new Square();
System.out.println( prova.invocarDraw( shape ) );
Circle circle = new Circle();
System.out.println( prova.invocarDraw( circle ) );
}
}
Onde:
private String invocarDraw(? obj) {
return obj.draw;
}
deve ser substituído por:
private < T extends Shape > String invocarDraw( T obj ) {
return obj.draw();
}
Nesse trecho é apresentada a forma correta de implementar esse método utilizando genérics. Quando usei
< T extends Shape >
estava indicando que no meu método qualquer objeto que fosse uma subclasse de Shape seria aceito. Então usei o tipo T (poderia ser qualquer outra letra) para identificar o tipo e usá-lo dentro da classe. É claro que existem diversas particularidades sobre generics a serem estudadas, mas isso você consegue com algumas pesquisas (até rápidas).
Já que draw é um método é necessário invocá-lo corretamente e não usá-lo como se fosse um atributo. Assim esse seu método deve compilar normalmente. O mesmo resultado seria obtido caso o método fosse implementado da seguinte maneira:
private String invocarDraw( Shape obj ) {
return obj.draw();
}
Quanto ao resultado:
Shape.draw().
Shape.draw().Rectangle.draw().Square.draw().
Shape.draw().Rectangle.draw().Square.draw().Circle.draw().
Obs. Não esqueça de usar a tag code quando for passar algum código.