Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

236
Visualizações
Genéricos de Java: el tipo debe ser de Clase T "o" extender S

Estoy desarrollando un ComboBox (más por contexto que por significado real), y me gustaría saber si el operador "o" existe en los genéricos de Java. Por ahora, la declaración se ve así:

 public class SComboBox<T extends ComboBoxItem> extends JPanel {

Donde ComboBoxItem es una interfaz que creé para elementos que se pueden usar en ComboBox. Sin embargo, también me gustaría aceptar String como tipo, lo que parece una tarea difícil ya que:

  1. String es una final class por lo que no hay forma de que alguien pueda extenderla.
  2. No estoy seguro si puedes poner algo como "|" (o) operador, o simplemente especificar una clase aceptable. Dado que hay un operador "y" ( <T extends A & B> ), imaginé que tendría sentido tener el "o" (|) también.

Mi pregunta es esencialmente el punto 2. ¿Puedo, en términos genéricos, especificar una clase que quiero aceptar y/o usar algo como "|"? Si no es así, ¿hay alguna solución o debo descartar la idea de usar genéricos?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

No existe el operador "o" para los genéricos, y por una sencilla razón.

La idea de indicar el tipo al principio es permitirle usar métodos de ese tipo en su implementación de la clase.

Cuando usa el operador "y" ( extends A & B ), sabe que cualquier objeto que se le pase, puede acceder a cualquiera de los métodos de la clase A , así como a cualquiera de los métodos de la clase B

Pero, ¿qué pasaría si fuera un "o"? Luego, se le pasa un objeto que puede ser un ComboBoxItem que le permite usar los métodos de ComboBoxItem , o es solo una cadena, lo que significa que no puede usar ninguno de esos métodos. En el momento de la compilación, no sabe qué objeto se le pasa, por lo que no tiene sentido dar el tipo.

El "O" no es útil. Si no está utilizando ningún método del objeto, es mejor que no use extends en absoluto.


La verdadera pregunta aquí es qué está tratando de hacer, que se puede aplicar tanto a las cadenas como a los elementos del cuadro combinado, pero no a nada más. Huele a problema de diseño.

over 4 years ago · Santiago Trujillo Relatório

0

En resumen, esto no es posible. Una clase no puede heredar de una de dos interfaces, ya que sería imposible determinar qué clase se implementa realmente.

Podría implementar un contenedor de cadenas, como mencionó JayC667, y hacer que implemente su interfaz ComboBoxItem. Supongo que necesita algunas funciones especiales introducidas por ComboBoxItem de todos modos.

algún ejemplo:

 interface ComboBoxItem{ String getDisplayText(); default Color getBgColor(){ return Color.WHITE; } default Color getFgColor(){ return Color.BLACK; } default ImageIcon getIcon(){ return null; } default boolean useIcon(){ return false; } }

Y con una implementación simple que solo toma la entrada de String.

 public class StringCbItem implements ComboBoxItem { private final String text; StringCbItem (String text){ this.text = text; } @Override String getDisplayText(){ return text; } }

Para el ComboBox, probablemente usaría el JComboBox predeterminado. Puede anular su comportamiento de visualización y representación pasando una implementación personalizada de ListCellRenderer.

 public class MyRenderer extends JLabel implements ListCellRenderer<ComboBoxItem> { public MyRenderer () { setOpaque(true); } public Component getListCellRendererComponent(JList<?> list, ComboBoxItem value, int index, boolean isSelected, boolean cellHasFocus) { setText(value.getDisplayText()); setBackground(value.getBgColor()); setForeground(value.getFgColor()); if(value.useIcon()){ setIcon(value.getIcon()); } return this; } }

¡Este es solo un ejemplo de cómo hacerlo y solo pretende ser un punto de partida!
Puedes leer más sobre esto aquí:
Cómo usar cuadros combinados
Interfaz ListCellRenderer

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda