Establecer la subclase Set como superclase Set en java.
¿Hay alguna manera de convertir Set<Subclass>
a Set<Superclase>
?
He intentado de estas 3 maneras a continuación. ¿Hay alguna forma mejor o alguna práctica recomendada para esto?
// clase que extiende a la superclase
final class MapEntryCustom implements Map.Entry<String,Object> {
// todas las implementaciones
}
// variable para convertirse
private Set<MapEntryCustom> entrySet = new HashSet<>();
// 3 formas diferentes de conversión
public Set<Entry<String, Object>> getSetMapEntry() {
return (Set<Entry<String, Object>>) entrySet; // error no se puede convertir
return (Set<? extends Entry<String, Object>>) entrySet; // error no se puede convertir
return (Set<Entry<String, Object>>) (Set<? extends Entry<String, Object>>) entrySet; // advertencia de seguridad de tipo
}
davy.ai
Sí, es posible convertir
Set<subclase>
aSet<superclase>
pero con algunas restricciones. Se puede hacer utilizando tipos genéricos comodín. Hay tres maneras en las que podemos castearSet<subclase>
aSet<superclase>
:return (Set<superclase>) entrySet;
Este método no se recomienda porque puede arrojar una ClassCastException en tiempo de ejecución si el Set contiene algún objeto que no sea del tipo Superclase.Comodines de límite superior:
return (Set<? extends Superclase>) entrySet;
Esta es una forma segura de castear, y no arrojará una ClassCastException. Este método permite que el Set contenga cualquier objeto que extienda Superclase.Doble casting:
return (Set<superclase>) (Set<? extends Superclase>) entrySet;
Este método es similar al segundo método, pero también proporciona un cast seguro en cuanto al tipo. No arrojará una ClassCastException, y también garantizará que el Set solo contenga objetos del tipo Superclase.El método recomendado para castear
Set<subclase>
aSet<superclase>
es utilizando el segundo método con comodines de límite superior.