2015-06-04 11 views
6

sto affrontando il seguente problema:generici Java: mancata corrispondenza Bound: il tipo non è un sostituto valido per il parametro limitata del tipo

ho questi classe & definizioni di interfaccia

public abstract class ViewModelRefreshPostListFragment<T extends IRefreshPostViewCallback, R extends RefreshPostViewModel<T>> 
    extends RefreshPostListFragment implements IRefreshPostView { 

    private final ViewModelHelper<T, R> mViewModeHelper = //error here 
     new ViewModelHelper<>(); 

... 
} 

public abstract class RefreshPostViewModel<R1 extends IRefreshPostViewCallback> extends AbstractViewModel<IRefreshPostViewCallback> {} 

public class ViewModelHelper<T extends IView, R extends AbstractViewModel<T>> {} 

public abstract class AbstractViewModel<T extends IView> {} 

public interface IRefreshPostViewCallback extends IView {} 

Eclipse dà me ancora questo errore: Bound non corrispondente: il tipo R non è un sostituto valido per il parametro limitato <R extends AbstractViewModel<T>> del tipo ViewModelHelper<T,R>

sulla base di Java eredità mi crea ted queste 2 catene:

"catena" dalla definizione ViewModelRefreshPostListFragment classe
1) R extends RefreshPostViewModel<T> ->R extends RefreshPostViewModel<R1 extends IRefreshPostViewCallback> ->R extends AbstractViewModel<IRefreshPostViewCallback>
1,1) T extends IRefreshPostViewCallback
1,2) T (da RefreshPostViewModel<T>) è sostituito dal <R1 extends IRefreshPostViewCallback> risultato consitent da 1.1) e 1.2) quindi il parametro T deve essere OK.

"catena" dal ViewModelHelper definizione di classe
2) R extends AbstractViewModel<T>
2,1) T extends IView, IRefreshPostViewCallback extends IView ->T possono essere sostituiti da IRefreshPostViewCallback

Se applico 2.1) su 1.1) & & 1.2) abbiamo vedere, il parametro T è coerente

Da 1) segue R extends AbstractViewModel<IRefreshPostViewCallback> da 2) segue R extends AbstractViewModel<T> e da 2. 1) segue che T può essere sostituito da IRefreshPostViewCallback, Se capisco le cose correttamente, questo errore non dovrebbe apparire, qualcuno potrebbe spiegarmi, perché eclipse mi sta dando l'errore ??

Grazie!

risposta

4

Il messaggio di errore deriva dal fatto che R non è nei limiti.

La classe ViewModelHelper estende AbstractViewModel<IRefreshPostViewCallback>, non importa quale sia lo R1.

Nella classe ViewModelHelper, modificare l'argomento di tipo nella clausola extends di AbstractViewModel a R1, invece di IRefreshPostViewCallback.

public abstract class RefreshPostViewModel<R1 extends IRefreshPostViewCallback> 
    extends AbstractViewModel<R1> 

e questo eliminerà l'errore.

Questo passerà il corretto T lungo in ViewModelHelper. Invece di R è RefreshPostViewModel<IRefreshPostViewCallback>, si utilizzerà RefreshPostViewModel<T>, rispettando i limiti.

+0

Grazie, questa risposta ha davvero risolto il mio problema. Immagino che tu abbia accidentalmente scritto 'ViewModelHelper' invece di' RefreshPostViewModel' 2a e 3a sezione. – FilipR

Problemi correlati