[
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]