Mam problem z następującym problemem. Mam serię obiektów funkcji, każdy z własnymi typami wejściowymi i wyjściowymi zdefiniowanymi za pomocą ogólnych argumentów typu w java. Chciałbym rozmieścić je w łańcuchu, tak aby surowe dane były wprowadzane do pierwszej funkcji, przekształcane do postaci wyjściowej, która jest typem wejściowym następnego obiektu i tak dalej. Oczywiście byłoby to trywialne w przypadku twardego kodu, ale chciałbym, aby kod mógł być podłączony do nowych obiektów funkcji. jeśli po prostu pominąć argumenty typu (tylko ostatni typ wyjścia), to jak wyglądają sprawy:Java Generics: łączenie razem obiektu funkcji ogólnej
public T process() {
Iterator<Context> it = source.provideData();
for(Pipe pipe : pipeline) {
it = pipe.processIterator(it);
}
return sink.next(it);
}
tutaj iterator nad dane są przekazywane między obiektami funkcyjnych, a kontekst powinien być kontekst. czy istnieje sposób na utrzymanie tego rodzaju rur wtykowych i nadal utrzymują bezpieczeństwo typu?
edytuj: dla przejrzystości, mam serię obiektów funkcji, potoków. każdy przyjmuje jako dane wejściowe określonego typu i wyprowadza inny typ. (w rzeczywistości Iteratory nad tymi typami) będą one połączone razem, np. Pipe<A,B> -> Pipe<B,C> -> Pipe<C,D> -> ...
, tak, że wyjście z jednej rury jest typem wejściowym dla następnej rury. Jest tu również źródło, które wyprowadza iterator typu A i zlew, który zaakceptuje typ (wyjście poprzedniej rury). czy to sprawia, że rzeczy są wyraźniejsze? Pytanie brzmi, ponieważ istnieje krytyczna zależność od kompatybilności typów wejść i wyjść, czy istnieje sposób, aby to zapewnić?
Zaczynam myśleć, że wstawienie obiektów funkcji do potoku może być najlepszym momentem do zapewnienia bezpieczeństwa typu, ale nie jestem pewien, jak to zrobić.
edit 2: Mam metodę adder dla obiektów funkcyjnych, które obecnie wygląda jak poniżej:
public void addPipe(Pipe<?,?> pipe) {
pipeline.add(pipe);
}
chciałbym sprawdzić, czy pierwszy parametr typ jest taka sama jak „końca” bieżącą potokiem i wyrzucić wyjątek, jeśli nie? Nie sądzę, jest tu dobry sposób, aby uzyskać tutaj czas kompilacji bezpieczeństwa. "koniec" bieżącej rury można następnie ustawić na drugi typ rury wejściowej. Nie mogę myśleć o tym, jak to zrobić z lekami generycznymi, a przekazywanie informacji o klasie wydaje się dość odrażające.
Usunięcie tekstu może utrudnić życie w pełni w pełni funkcjami ogólnymi. Kompilator bajtów JVM usuwa typ z instancji klas ogólnych, więc lista staje się listą
Czy możesz wyjaśnić ten wymóg trochę więcej? Nie można ustalić, co masz i co chcesz mieć. –
więc najlepiej byłoby spróbować zapewnić bezpieczeństwo typu podczas wstawiania obiektu funkcji rury (jak?) I po prostu tłumić ostrzeżenia w powyższej metodzie? – downer