[ 
https://issues.apache.org/jira/browse/LANG-819?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13868294#comment-13868294
 ] 

Shevek commented on LANG-819:
-----------------------------

Thank you very much for the responses.

C++ can do "Foo const * const * const *" which tells you whether it's the 
pointer or the target which is immutable. Java can basically only make the 
pointers immutable without a little help from this trick. Yes, you _can_ mutate 
the collection with Iterator.remove() or Collection.clear() but at least the 
programmer has already been forced to declare their knowledge that this is 
Naughty(tm). Also, clear() is presumably slower than the garbage collector if 
the object is still in eden space, so who does that anyway? Also, see all 
Google's typed-immutable collections, which, in return for being immutable, 
save memory and improve performance.

Yes, I think that last Google case from Thomas can't _quite_ be expressed in 
the Java type system - it's not actually quite complete and consistent. You get 
wrapped up in "? super (? extends E)" which isn't sufficiently well defined in 
the lattice. Some of us would love to reduce that to "? super E" which would 
suffice for practical purposes, but isn't mathematically correct. Don't take 
this comment as gospel - check yourself. I don't tend to use transform() or 
map-reduce structures as much as I used to because I tend to be working with 
very large implicit collections where C*'s OpenBitSet is more relevant than 
java.util.BitSet or generateBitVector().


> EnumUtils.generateBitVector needs a "? extends"
> -----------------------------------------------
>
>                 Key: LANG-819
>                 URL: https://issues.apache.org/jira/browse/LANG-819
>             Project: Commons Lang
>          Issue Type: Bug
>          Components: lang.*
>    Affects Versions: 3.0.1
>            Reporter: Shevek
>            Priority: Minor
>             Fix For: 3.3
>
>
>     public static <E extends Enum<E>> long generateBitVector(Class<E> 
> enumClass, Iterable<E> values) {
> Should be Iterable<? extends E>.
> This is because although no subclasses of E can exist, the "? extends" is a 
> common idiom for marking the collection as readonly, or not "owned" by the 
> current object.



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to