Thanks for the reference Marshall,

Try this code:
public static void main(String[] args) {

   List<Number> tokens = new ArrayList<>();
   tokens.add(3);
   tokens.set(0, 4);

   ArrayList<? super Number> generalize = (ArrayList<? super Number>) tokens; 
// Upcasts all to number
   Number n = 5;
   generalize.set(0, n);              // ok
   var x = generalize.get(0);         // ok
   // n = generalize.get(0);          // compile error
   System.out.println(tokens.get(0)); // ok prints 5
   x = tokens.get(0);                 // ok
   n = tokens.get(0);                 // ok

   List unknown = tokens;             // warning
   unknown.set(0, "foo");             // warning

   // String t = tokens.get(0);          // compile error
   // String t = (String) tokens.get(0); // compile error
   System.out.println(tokens.get(0));    // ok prints "foo"
   n = tokens.get(0);                    // throws ClassCastException

}

> In fact, there's no cast I could figure out to make "generalize.set" work at
> all, except by changing its definition to use ArrayList (bare with no generic
> argument):
>
>     ArrayList generalize = (ArrayList<? extends Number>) tokens; //compiles 
> with
> warnings,
>     generalize.set(0, 7);  // works at runtime

I thought we can do a upcast and use <? super FeatureStructure> which gets 
around the set problem you found but it looks like there are problems on the 
get side...
The use of var is possible to get around the immediate errors but that is Java 
10+

Moved the example to get the runtime error at the end

The run time exception comes in the get() call and setting it to the generic 
type. (

Hai-Son

NOTICE TO RECIPIENT:  If you are not the intended recipient of this e-mail, you 
are prohibited from sharing, copying, or otherwise using or disclosing its 
contents.  If you have received this e-mail in error, please notify the sender 
immediately by reply e-mail and permanently delete this e-mail and any 
attachments without reading, forwarding or saving them.  Thank you.

Reply via email to