A good reference: 
http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ303

-Marshall

On 7/7/2015 3:37 PM, Marshall Schor wrote:
> Burn reports a source incompatibility with the 2.8.0 signature for the
> getAllIndexedFS.  This is a somewhat complex issue.  Here's what I've found 
> so far:
>
> 1) We have 3 sets of versions of getAllIndexedFS - one in the plain CAS index
> repo, one in the JCas version of the index repo, and one directly in the JCas
> itself.  The signatures are not consistent.
>
> 2) https://issues.apache.org/jira/browse/UIMA-4299 strongly suggests not
> returning values of <? extends XXX>.  We opted in the plain CAS version to use
>    <T extends FeatureStructure> FSIterator<T> getAllIndexedFS(...)
> and in the JCas index version:
>                                 FSIterator<FeatureStructure> 
> getAllIndexedFS(...),
> and in the JCas itself:
>    <T extends TOP>              FSIterator<T> getAllIndexedFS(Class<T> clazz)
>
> 3) At first I thought that it was quite possible that the getAllIndexedFS call
> will produce an iterator which returns a mixture of subtypes of the specified
> class, or instances of FeatureStructure, which are not a subtype of the
> specified class, and would produce a ClassCastException when assigned to a
> variable of the iterator type.  I thought that FeatureStructure will be 
> produced
> if there is no JCas cover class, but I think this is incorrect.
> There are generators for each type that generate the corresponding Java 
> class. 
> As part of the JCas creation, the method instantiateJCas_Types is called and
> will replace the generators with JCas versions.  If no JCas cover class can be
> found for a particular type, the generator is still replaced with one for the
> first JCas cover type found in the supertype chain.  Since TOP is a built-in
> defined JCas type, even if no other types have JCas cover types, TOP will.
>
> 4) Current user code often has some JCas cover class as the top-most class of
> some set of Java cover objects being returned.  These are currently failing 
> for
> some forms of getAllIndexedFS calls - the ones returning
> FSIterator<FeatureStructure>  These should be changed (back) to returning 
> either
> <T Extends TOP> or just TOP.
>
> 5) I'd like to use the <T extends TOP> form, but would like other Java experts
> to weigh in to see if that would cause issues...  To be precise, I'd like the
> signature to look like:
>    <T extends TOP>  FSIterator<T> getAllIndexedFS(...) for those calls that
> don't specify the Java class in the argument.
> The pros for this is that the coder can specify a subtype of TOP if they know
> that will be returned.  The con for this is that the coder could make a 
> mistake,
> and a runtime class-cast exception could happen, if the item returned was not 
> a
> subtype.
>
> Other learned opinions politely solicited :-) .
>
> -Marshall
>
>

Reply via email to