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

Uwe Schindler commented on LUCENE-2953:
---------------------------------------

The easy and most simply way to handle this is osing Object[] like in ArrayList.

The problem with then always casting from Object to T is thousands of unchecked 
warnings in PriorityQueue. I would propose the following:
In general the final T[] heap variable should be private to the PQ and used 
only there. For performance yonik wanted the heap[] protected and that caused 
the issue. As long as the heap[] array is private it can never be accessed 
incorrectly.

So my proposal is to internally use the T[] as a private field and simply use 
another Object[] thats protected (pointing to the same array). This would fix 
the problem. The most correct idea would be to add a setHeapSlot(int, T o) and 
T getHeapSlot(int) method and hiding the T[] heap completely, but I know, Yonik 
will disagree :-)

There is some other problem: the heap array should be final, but it cannot, 
because of the stupid initialize() method. I would like to remove this method 
and simply move the code to PQ's ctor. I don't understand why the initialize() 
method is there, which is a problem: Every guide on Java programming tells you 
to never call protected overrideable methods from ctors, as this can break 
easily. If the heap[] is final, the problem of having two references to the 
same object is not a problem anymore.

> PriorityQueue is inheriently broken if subclass attempts to use "heap" 
> w/generic T bound to anything other then "Object"
> ------------------------------------------------------------------------------------------------------------------------
>
>                 Key: LUCENE-2953
>                 URL: https://issues.apache.org/jira/browse/LUCENE-2953
>             Project: Lucene - Java
>          Issue Type: Bug
>            Reporter: Hoss Man
>         Attachments: BenchmarkArrayAccess.java, LUCENE-2953.patch
>
>
> as discovered in SOLR-2410 the fact that the protected "heap" variable in 
> PriorityQueue is initialized using an Object[] makes it impossible for 
> subclasses of PriorityQueue to exist and access the "heap" array unless they 
> bind the generic to Object.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to