¿Tiene una clase que implementa el método de una interfaz (sin implementar explícitamente que la interfaz) se extienden esa interfaz específica?

Liviu Florescu:

Me estoy poniendo en práctica una clase para almacenar los objetos que se pueden asignar un doble valor. Por esta razón, he creado un HasDoubleValue interfaz, que contiene un solo método:

public interface HasDoubleValue{
    public double doubleValue();
}

Mi clase principal se define como tal:

Data <O extends HasDoubleValue> {...}

Ahora, cuando intento inicializar esta clase para almacenar enteros, consigo un "argumento de tipo entero no está dentro de los límites de tipo variable O" de error, aunque el implementos enteros doubleValue () método por defecto.

Supongo que esto sucede porque Entero no explícitamente poner en práctica mi interfaz HasDoubleValue, aunque tiene el método que estoy buscando. ¿Es esto correcto? Lo que sería una solución natural?

JB Nizet:

Si esta correcto. Java no utiliza pato tipificación como JavaScript o mecanografiado.

Una solución es crear una clase de adaptador que se ajusta un número entero, los delegados a la misma, y, de hecho implementar la interfaz.

O, ya que eneste caso de que su interfaz es una interfaz funcional, para usar una lambda o una referencia método para crear una instancia de HasDoubleValue de un entero.

public interface HasDoubleValue{
    double doubleValue();
}

final class IntegerHasDoubleValueAdapter implements HasDoubleValue {
    private final Integer i;

    public IntegerHasDoubleValueAdapter(Integer i) {
        this.i = i;
    }

    @Override
    public double doubleValue() {
        return i.doubleValue();
    }
}

class Data<O extends HasDoubleValue> {
    void put(O o) {}

    public static void main(String[] args) {
        Integer i = 42;

        Data<IntegerHasDoubleValueAdapter> d1 = new Data<>();
        d1.put(new IntegerHasDoubleValueAdapter(i));

        Data<HasDoubleValue> d2 = new Data<>();
        d2.put(() -> i.doubleValue());

        Data<HasDoubleValue> d3 = new Data<>();
        d3.put(i::doubleValue);
    }
}

Supongo que te gusta

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