El estrechamiento de Java Conversión de referencia de un tipo a una interfaz

Moisés Besong:

Tratar de entender java conversión de restricción de una clase a una interfaz. Los JLS ( JLS-5.1.6 ) establece:

Desde cualquier tipo de clase C a cualquier no parametrizada tipo de interfaz K, a condición de que C no es definitiva y no implementa K.

Para probar esto, he creado una clase y una interfaz. Entonces intentado colar la clase a la interfaz, pero conseguir un ClassCastException en tiempo de ejecución. Esta es una muestra de mi código.

class NarrowingReferenceConversion
{
    public static void main(String args[])
    {

        S s = new S();
        T t = (T)s;

    }
}

interface T
{
    public void print();
}

class S
{
    public void print(){
        System.out.println("S.print()");
    }
}

Al compilar y ejecutar el anterior me sale el mensaje de error siguiente:

Excepción en hilo "principal" java.lang.ClassCastException: S no puede ser fundido a T

Eran :

Se trata de una conversión que no se garantiza que funcione, al igual que echa una referencia de una clase base a una sub-clase no se garantiza que funcione. Es por eso que se considera una conversión de restricción.

El compilador sabe que la conversión podría funcionar en tiempo de ejecución, por lo que lo permite, pero si no funciona, ClassCastExceptionse lanza en tiempo de ejecución.

Sólo si se asigna a suna instancia de una subclase de Sque no implementar la interfaz T, la conversión va a funcionar.

class NarrowingReferenceConversion
{
    public static void main(String args[])
    {

        S s = new S2();
        T t = (T) s; // this will work, since S2 implements T

    }
}

interface T
{
    public void print();
}

class S
{
    public void print(){
        System.out.println("S.print()");
    }
}

class S2 extends S implements T
{
}

Vamos a explicar las dos condiciones de esta conversión:

  1. "C no es definitivo" - si era final, no habría subclases de C, por lo que el compilador sabe a ciencia cierta esta conversión no puede nunca trabajo, y la compilación falla.

  2. "no implementa K" - si se Cimplementa K, esto ya no es una conversión de restricción. Se convierte en un Ensanchamiento Conversión de referencia , con garantía de éxito en tiempo de ejecución. De hecho, no habría necesidad de utilizar el operador de conversión. Una asignación simple es suficiente.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=236635&siteId=1
Recomendado
Clasificación