Casting entre subclase / interfaz y superclase

Considere el siguiente código:

interface IFace {}

abstract class Supertype {}

class Subtype1 extends Supertype implements IFace {}
class Subtype2 extends Supertype implements IFace {}
class Subtype3 extends Supertype {}

class Foo {
    //Contains elements of Subtype1 and Subtype2
    List<IFace>     ifaceList = new ArrayList<IFace>();

    //Contains elements of Subtype1, Subtype2, and Subtype3
    List<Supertype> superList = new ArrayList<Supertype>();   

    void CopyItem() {
        superList.add( (Supertype) ifaceList.someElement() );
    }
}

¿Es seguro emitir un IFaceelemento Supertypesi sé que solo se implementarán los subtipos IFace? ¿Es posible garantizar que solo se implementarán los subtipos IFace?

Estoy tratando de usar IFacecomo interfaz de marcador para mantener solo ciertos subtipos en la primera lista y permitir cualquier subtipo en la segunda lista.

Respuesta 1

La forma más segura sería hacer que Supertype implemente IFace. Si eso no es posible, entonces es seguro lanzar un elemento IFace a Supertype siempre que cada clase que implemente IFace sea también una subclase de Supertype. Tendrás que asegurarte de que eso es cierto por el momento, que es bastante propenso a errores.

Respuesta: 2

¿Es seguro lanzar un elemento IFace a Supertype si sé que solo los Subtipos implementarán IFace?

Si sabe con certeza que todos los elementos de IFace también extienden Supertype, entonces no será un problema. Pero en el futuro puede que esto ya no sea cierto.

¿Es posible asegurar eso?

Si. Puede intentar atrapar el ClassCastException o incluso probarlo mejor antes de enviarlo con el operadorinstanceof

void CopyItem() {
    IFace obj = ifaceList.someElement();
    if (obj instanceof Supertype) superList.add( (Supertype)obj );
    else System.err.println("WARNING: IFace object is not a Supertype.");
}
Respuesta: 3

Trato de asegurar la precisión de algunas herramientas (gratuitas) de creación de perfiles de CPU de Java, por ejemplo, sjk, visualvm. Aquí hay un programa de muestra para realizar tareas sensibles a la CPU: RandomStringUtils.java: import java.util.Random; público ...

¿Es posible usar Java para crear gráficos dinámicos que se actualicen automáticamente cuando reciba valores del exterior? Crearía una aplicación que verifique automáticamente las estadísticas de un ...

Estoy tratando de leer el archivo línea por línea con cierto retraso. Por ejemplo: leer e imprimir la primera línea del archivo, esperar 10 segundos leer e imprimir la segunda línea del archivo, etc. Hasta ahora he intentado algo ...

Tengo el siguiente código que funciona en eclipse 3.7: IEditorReference privado getReference (parte IEditorPart) {return (IEditorReference) ((PartSite) part.getSite ()). GetPane () ...