Typecastando um generic type

12 respostas
Filipe_Silva

Olás,

alguém sabe como (ou ‘se’) podemos fazer algo do tipo:

public interface Ring {
  public void doesNothing();
}

public interface TabajaraRing extends Ring {
  public void doesLessThanNothing();
}

public interface RingBearer {
  public List<SimpleRing> getRingList();
}

public interface TabajaraRingBearer extends RingBearer {
  public void whatever();
}

public class Bilbo implements TabajaraRingBearer {
  
  private List<TabajaraRing> iRingList;

  public void whatever(){}

  public List<SimpleRing> getRingList() {
   // return iRingList;                               erro de types
    return (List<SimpleRing>)iRingList;    //tbm  erro de types
  }
}

Enfim, o Bilbo quer honrar o contrato RingBearer, implementando o método public List getRingList(). Ele tem uma List internamente.

Como retornar a iRingList?

Filipe

12 Respostas

louds

Vocë vai tem que fazer um unsafe cast para funcionar. A situação é a mesma que usando arrays.

mister_m

Se você mostrar no seu código o que é uma SimpleRing, talvez a gente consiga ajudar :slight_smile:

Filipe_Silva
public interface Ring {
   public void doesNothing();
 }
 
 public interface TabajaraRing extends Ring {
   public void doesLessThanNothing();
 }
 
 public interface RingBearer {
   public List<Ring> getRingList();
 }
 
 public interface TabajaraRingBearer extends RingBearer {
   public void whatever();
 }
 
 public class Bilbo implements TabajaraRingBearer {
   
   private List<TabajaraRing> iRingList;
 
   public void whatever(){}
 
   public List<Ring> getRingList() {
    // return iRingList;                               erro de types
     return (List<Ring>)iRingList;    //tbm  erro de types
   }
 }

Ae mister_m, consertado. Como vc faria o retorno então?

mister_m

Consertado onde? Ainda não tá explicado o que é o SimpleRing…

Filipe_Silva

Não tem SimpleRing!!! Onde vc tá vendo simplering kra?

:slight_smile:

mister_m

Aqui :slight_smile:

Filipe Silva:
public interface RingBearer { public List&lt;SimpleRing&gt; getRingList(); }

Filipe_Silva

Kra, vc é um compilador. troque SimpleRing por Ring e ‘voila’

mister_m

Filipe Silva:
Meu, eu acabei de postar o código de novo kra, esqueça a primeira listagem homi de deus

:P

Eu sei, isso tá na segunda. Antes de achar que eu estou errado, verifique se não é você que está :wink:

Filipe_Silva

Ok, ok, vc venceu. Mas agora tá certo né? E ae? como vc faria o retorno?

mister_m

Mude a primeira declaração para (não testado):

public interface RingBearer {
    public List<? extends Ring> getRingList();
  }
mister_m

Ooops, desculpa, isso também não resolve. Você vai precisar de algo como:

public interface RingBearer&lt;T extends Ring&gt; {
    public List&lt;T&gt; getRingList();
  }
Filipe_Silva

Kra, funcionou na medida. Muito obrigado e foi mal pelos erros.

Filipe

Criado 17 de abril de 2005
Ultima resposta 20 de abr. de 2005
Respostas 12
Participantes 3