Duvida Programa

3 respostas
Markinhus86

Ae pessoal duas duvidas pf

  • Qual deve ser a classe do parametro obj do metodo invocarDraw da classe Prova?
  • Quais serao as saidas da classe Prova?
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 String invocarDraw(? 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 shape = new Square();

System.out.println(prova.invocarDraw(shape));

Circle circle = new Circle();

System.out.println(prova.invocarDraw(circle));

}}

Valeuu =)

3 Respostas

eberson_oliveira

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).

return obj.draw();

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.

Markinhus86

Mas entao qual deve ser a classe do parametro obj do metodo invocarDraw da classe Prova? Eh classe ShaPe?

eberson_oliveira

Sim.

Como você definiu que pode ser qualquer classe que estenda Shape, o compilador vai remover o tipo genérico (T no exemplo que te mostrei) e colocar Shape no lugar.

Criado 24 de fevereiro de 2010
Ultima resposta 25 de fev. de 2010
Respostas 3
Participantes 2