Oznaczenie błędu w trakcie kompilacji programu

0

Witam,

Mam gotowy program, który wyrzuca ClassCastException, wiem w którym miejscu.
Mam teraz za zadanie, wymyślić sposób aby temu zaradzić w fazie kompilacji tak aby kompilator oznaczył daną linię jako błąd.
Trochę mnie to dziwi, ponieważ IntelliJ od razu przy próbie uruchomienia wyrzuca błąd i linię w której się znajduje.
Rozumiem, że to zadanie, które poinformuje kogoś kto pisze w cmd?

public class ImportantClass {

    public static void main (String args[]) {

        Function<String, List<Integer>> takeInt = line -> {
            // taking ints from string
            return null;
        };

        Function<List<Integer>, Integer> sumAll = line -> {
            // summing ints
            return null;
        };

        List<String> arglist = Arrays.asList(args);
        Execute<List<String>> importantClass = new Execute<>(arglist);
        Integer result = importantClass.make(takeInt, sumAll); // tutaj problem z castowaniem bo takeInt oczekuje Stringa a dostaje Listę
    }
}

oraz:

public class Execute<T> {

    private T words;

    public Execute(T words) {
        this.words = words;
    }

    public <R> R make(Function<?, ?>... tab) {
        Function f = tab[0];
        R abc = (R) f.andThen(tab[1]).apply(words);
        return abc;
    }
}

Podobno powinienem poprawić metode Execute a ImportClass nie potrzebuje zmiany (ale można to zrobić).
Niestety nie bardzo rozumiem co oznacza "na poziomie kompilacji" tymbardziej przy korzystaniu z IntelliJ, który robi wszystko sam.

0

public <R> R make(Function<?, ?>... tab) { -> używasz wildcardów ? więc kompilator nie wie jakie typy się tam mogą pojawić.

0

Rozumiem, czyli to jest rozwiązanie mojego zadania (kompilator nie wie jakie typy może otrzymać) czy odwrotnie, przy takim zapisie nie da się oznaczyć już z poziomu kompilacji błędu (tutaj ClassCastException)?
Funkcja make jest tak napisana, ponieważ nie mogę ograniczyć się do konkretnych "Functionów" w trakcie działania i może być ich więcej dopisanych.

0

No dobra ale widzisz chyba teraz że kompilator nie sprawdzi czy te typy które składasz pasują do siebie? Bo normlanie jeśli robisz złożenie f(g(x)) to argumentem f() musi być typ zwracany przez g().

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