Multiplier is not abstract and does not override abstract method compute(Double) in Computation

0

Witam. Mam problem z tytułowym komunikatem. Stworzyłem interfejs funkcyjny posiadający jedną metodę. Potem stworzyłem klasę implementującą instancję tego interfejsu dla konkretnego typu. Szukałem odpowiedzi, lecz wszelkie przykłady pokazują dokładnie ten sposób, w który ja zaimplementowałem interfejs. Oczywiście @Override także wywołuje błąd. Proszę o jakąś podpowiedź, co z tym kodem jest nie tak?

Computation.java:

import java.lang.Double;

@FunctionalInterface
public interface Computation<T> {
    T compute(T x);
}

Multiplier.java:

public class Multiplier implements Computation<Double> {

    private double a;

    Multiplier(double a) {
        this.a=a;
    }

    @Override
    public double compute(double x) {
        return a*x;
    }
}

Wiem, że problem tkwi w tym, że implementacja dotyczy instancji dla Double, a metoda przyjmuje i zwraca double. Niestety, takie dostałem wymagania co do programu.

0

jakies pierwotne zlo sie tu odbywa, niemniej odpowiadajac na pytanie, zrob uppercase i bedzie dobrze, t.j. o tyle lepiej ze sie skompiluje

public class Multiplier implements Computation<Double> {
 
    private double a;
 
    Multiplier(double a) {
        this.a=a;
    }
 
    @Override
    public Double compute(Double x) {
        return a*x;
    }
}
0

Mógłbyś wyjaśnić mi, dlaczego pierwotne zło? Wiem, że całość powinna wyglądać, jak w Twojej odpowiedzi. Niestety, w treści zadania mam, że całość ma wyglądać tak, jak u mnie.

Prosiłbym jeszcze o pomoc w jednej kwestii. Jak odwołać się do klasy (nie obiektu) w metodzie statycznej przyjmującej jako argument Computation<Double>?

0

Mógłbyś wyjaśnić mi, dlaczego pierwotne zło?

bo to jakas sztuka dla sztuki, nic to nie robi sensownego

Wiem, że całość powinna wyglądać, jak w Twojej odpowiedzi. Niestety, w treści zadania mam, że całość ma wyglądać tak, jak u mnie.

no to nie rozumiem z czym problem, zadanie masz zrobione :) tylko ze dziwne zeby na celu bylo stworzenie czegos co nie ma sensu i na dodatek sie nie kompiluje

Prosiłbym jeszcze o pomoc w jednej kwestii. Jak odwołać się do klasy (nie obiektu) w metodzie statycznej przyjmującej jako argument Computation<Double>?

mozesz uzyc refleksji, ale nie bardzo wiem po co chcialbys to robic, kompletnie przeczy to idei uzywania interfejsu

0

Chyba źle podszedłem do tematu. Parametrem ma być instancja klasy, a jeśli się nie mylę, takową jest obiekt.

0

Witam ponownie. Nie tworzę nowego wątku, gdyż problem dotyczy tego samego kodu. Napisałem kolejną klasę z metodą przyjmującą jako argument Computation<Double>. Chciałbym umieścić tam statyczną referencję do metody compute. Niestety, kompilator zwraca błąd: "error: incompatible types: invalid method reference" oraz "unexpected instance method compute(Double) found in unbound lookup". Szukałem odpowiedzi w internecie, jednak nic nie znalazłem. W różnych fragmentach kodu referencja jest umieszczona w dokładnie taki sposób, w jaki ja chciałem to zrealizować (Multiplier::compute). Proszę o wyjaśnienie, dlaczego ten sposób nie sprawdza się u mnie.

0

@kst142: a wiesz jak działają generyki w Javie? Parametrem nie może być typ prymitywny. doucz się najpierw postaw :)

0

Chodzi mi referencję Klasa::metoda. Metoda, do której ma być ta referencja, nie jest zadeklarowana jako static.

0

@kst142 rozumiem. Teraz przedstawie Ci przykład:

public static Collection<String> toLowerCase(Collection<String> strings) {
  return strings.stream.map(String::toLowerCase).collect(Collectors.toCollections());
}

Zadziała mimo że to metoda statyczna. Wszystko zależy od kontekstu, tutaj masz to opisane: method references

0

@scibi92: Nie do końca o to mi chodziło. W moim przypadku metoda nie jest static, więc chyba (ale nie jestem pewien) nie mogę użyć referencji Klasa::metoda.

1 użytkowników online, w tym zalogowanych: 0, gości: 1