How do supertype generics in Java work? -
i've been testing supertype generics java, i've come roadblock. sample code testing:
import java.util.*; class generictests { public static void main( string[] args ) { list<b> list3 = new arraylist<b>(); testmethod( list3 ); } public static void testmethod( list<? super b> list ) { list.add( new a() ); list.add( new b() ); } } class { } class b extends { }
when compiled, error is:
generictests.java:20: error: no suitable method found add(a) list.add( new a() ); ^ method list.add(int,cap#1) not applicable (actual , formal argument lists differ in length) method list.add(cap#1) not applicable (actual argument cannot converted cap#1 method invocation conve rsion) cap#1 fresh type-variable: cap#1 extends object super: b capture of ? super b 1 error
i thought given lower bound of b, add supertype? or apply references (i.e. arguments within method signature) because allowing supertypes break type checking?
the declaration list<? super b> list
says list
list
of objects of type b inherits from. type need not compatible a
. suppose hierarchy had been:
public class {...} public class c extends {...} public class b extends c {...}
then, list
list<c>
. list.add(new a())
illegal. instance of a
not instance of c
. compiler knows instances of b
or subclass can added list
.
Comments
Post a Comment