java - Why does this method call fail? (Generics & wildcards) -
i getting below error:
'call(containsmonitor)' cannot invoke 'call(? extends webscout.monitor)' in 'webscoutcallable'
monitor.java
webscoutcallable<? extends monitor> handler; public setcallable(webscoutcallable<? extends monitor> callable) { this.handler = callable; }
webscoutcallable.java
public interface webscoutcallable<t extends monitor> { public void call(t caller); }
containsmonitor.java
public class containsmonitor extends monitor { public void handledocument() { handler.call(this); } }
i'll freely admit i'm new generics , still quite new java itself. find error message confusing looks should work (method declaration expects monitor or subclass, i'm passing in subclass). (+explanation) appreciated!
thanks!
you have wildcard in type parameter of handler
variable. compiler doesn't know exact type of type parameter is, it's either monitor
or subclass.
the call
method takes t
, matched on wildcard. there no guarantee wildcard type containsmonitor
. monitor
, or monitorsubtypethatdoesntexistyet
. because compiler doesn't know actual type, cannot allow pass except null
, because non-null
argument, can't guarantee type safety.
you can around removing wildcard, , replacing concept type parameter on monitor
class.
class monitor<t extends monitor<t>> { webscoutcallable<t> handler; public void setcallable(webscoutcallable<t> callable) { this.handler = callable; } }
the interface webscoutcallable
changes little in response:
interface webscoutcallable<t extends monitor<t>> { public void call(t caller); }
the subclass feeds own name type argument when extending monitor
.
class containsmonitor extends monitor<containsmonitor> { public void handledocument() { handler.call(this); } }
now, t
known type, , containsmonitor
defines itself, it's legal pass call
.
Comments
Post a Comment