2009-06-07 16 views
5

Mam następujące klasy skonfigurować:rodzajowych Java, rozszerzone rodzajowych i klasy abstrakcyjne

public abstract class Process<T,S> { 
    ... 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    protected S processer; 
    ... 
} 

public class ProcessImpl<EventType1, EventType2> { 
    ... 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 
    processer = new ProcesserImpl(); 
    ... 
} 

Wszystko jest w porządku, dopóki nie dostać się do ResourceImpl. Powiedziano mi, że ProcessImpl nie jest poprawnym zamiennikiem ograniczonego parametru <S extends Process<T,S>> typu Resource<T,S>.

Próbowałem różnych sposobów obejścia tego i uderzania w ścianę.

Czy ktoś ma jakieś pomysły?

Odpowiedz

11
public class ProcessImpl<EventType1, EventType2> { 
... 
} 

Ponieważ ProcessImpl nie rozciągają Process. Twój ProcessImpl nie pochodzi od Procesu, który deklarujesz, że parametr powinien być.

0

Nie widzę sposobu na edytowanie oryginalnej wersji lub komentowanie podanych odpowiedzi bez lepszego powtórzenia.

Ten kod będzie istnieć w warstwie internetowej, typ zdarzenia2 jest zdefiniowany na warstwie trwałości i dostępny tylko w warstwie rdzenia, która istnieje poniżej tego poziomu.

Niestety, nie mając ścisłego połączenia, którego chciałbym uniknąć, nie mam dostępu do EventType2.

+0

Nie rozumiem. Czy nie można rozszerzyć ProcessImpl z procesu? –

1

Możesz chcieć zrobić coś takiego:

public abstract class Process<T, S> { 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    S processor; 

} 

public class ProcessImpl extends Process<EventType1, ProcessImpl> { 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 

} 

Jeśli ograniczyć parametr ResourceS być procesor trzeba także odpowiednio zadeklarować w klasie ProcessImpl. Nie wiem, co to jest EventType2, ale powinien implementować interfejs procesu. Zakładałem, że chcesz powiedzieć: ProcessImpl.

0

Jeśli nie chcesz, aby twój kod był zależny od istniejącego pakietu, który zawiera Process, możesz również wprowadzić nowy pakiet interfejsu w zależności od niczego na samym dole hierarchii klas. (Jeśli oczywiście możesz zmienić ograniczenia dziedziczenia.)