2015-06-04 7 views
6

ich folgendes Problem bin vor:Java Generics: Bound Mismatch: Der Typ ist kein gültiger Ersatz für den beschränkten Parameter des Typs

ich diese Klasse & Schnittstellendefinitionen haben

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 {} 

Eklipse gibt ich immer noch dieser Fehler: Bound Mismatch: der Typ R ist kein gültiger Ersatz für den beschränkten Parameter <R extends AbstractViewModel<T>> des Typs ViewModelHelper<T,R>

Basierend auf Java Vererbung I Crea ted diese 2 Ketten:

"Kette" von ViewModelRefreshPostListFragment Klassendefinition
1) R extends RefreshPostViewModel<T> ->R extends RefreshPostViewModel<R1 extends IRefreshPostViewCallback> ->R extends AbstractViewModel<IRefreshPostViewCallback>
1,1) T extends IRefreshPostViewCallback
1,2) T (aus RefreshPostViewModel<T>) durch <R1 extends IRefreshPostViewCallback> consitent Ergebnis ersetzt wird, von 1.1) und 1.2) also sollte der T-Parameter in Ordnung sein.

"Chain" von ViewModelHelper Klassendefinition
2) R extends AbstractViewModel<T>
2,1) T extends IView, IRefreshPostViewCallback extends IView ->T kann durch IRefreshPostViewCallback

ersetzt werden, wenn ich 2.1 gelten) auf 1,1) & & 1,2) wir siehe, Parameter T ist konsistent

Von 1) folgt R extends AbstractViewModel<IRefreshPostViewCallback> von 2) folgt R extends AbstractViewModel<T> und von 2. 1) folgt, dass T durch IRefreshPostViewCallback ersetzt werden kann, Wenn ich die Dinge richtig verstehe, sollte dieser Fehler nicht angezeigt werden, könnte mir jemand erklären, warum ist Eclipse geben mir den Fehler?

Vielen Dank!

Antwort

4

Die Fehlermeldung kommt von der Tatsache, dass R nicht innerhalb der Grenzen ist.

Ihre ViewModelHelper Klasse erweitert AbstractViewModel<IRefreshPostViewCallback>, egal was R1 wirklich ist.

In der Klasse ViewModelHelper, die in der extends Klausel AbstractViewModel-R1 Typen Argument ändern, statt IRefreshPostViewCallback.

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

und dies wird den Fehler beseitigen.

Dies wird die richtige T zusammen in ViewModelHelper passieren. Anstatt R als RefreshPostViewModel<IRefreshPostViewCallback> zu verwenden, verwenden Sie RefreshPostViewModel<T> und erfüllen die Grenzen.

+0

Danke, diese Antwort hat mein Problem wirklich gelöst. Ich nehme an, Sie haben versehentlich 'ViewModelHelper' anstelle von' RefreshPostViewModel' im zweiten und dritten Abschnitt geschrieben. – FilipR

Verwandte Themen