@BitemNet, odnośnie Twojego komentarza. Przeczytaj jeszcze raz moją poprzednią odpowiedź i zwróć uwagę na zwrot type erasure.
Ja w niej wskazywałem, że Reader ma być rzutowany na Double: Main<Double> tab = new Main<(2); ?
Nic takiego nie wskazałeś. Ten Double
nie ma tutaj nic wspólnego z tym, co się dzieje wewnątrz Main
. Dlaczego? Type erasure - w momencie użycia Java nie sprawdza już poprawności typów wewnątrz klasy Main
, bo nie może tego zrobić, bo tam z definicji T
jest już wymazane i zredukowane do typu Object
. Rozumiem, co chcesz zrobić, ale po prostu Java tak nie działa - nie da się tego zrobić.
Twój zapis Main<Double>
tak naprawdę nie robi nic, bo żeby miał on jakiekolwiek znaczenie, musiałbyś ten typ T
wstawić w argumencie metody, jako typ zwracanej wartości, albo jako rzucany wyjątek, np.
import java.io.*;
public class Main <T> {
T tab[];
Main(int size){
tab = (T[]) new Reader[size];
}
public void foo(T arg) {
tab = (T[]) new Reader[size]; // popatrz na to
}
public static void main(String args[]){
Main<Double> tab = new Main<>(2);
tab.foo(3.14); // <<<---- tu kompilator może coś z tym Twoim `Double` zrobić
}
}
I w tym wypadku faktycznie kompilator używa informacji, że jest typ Main<Double>
do sprawdzenia, że wywołanie metody tab.foo()
faktycznie przyjmuje Double
jako argument. Ale znowu - sprawdzi Ci wywołanie tej metody, ale zakłada z góry, że wnętrze (oznaczone komentarzem popatrz na to) jest prawidłowe.