> If type inferencing from the surrounding context wasn't done, and the user 
> needed to cast the result, the user would be exposed to the same runtime 
> error.  So, unless there's some other pros/cons, it seems to me it would be 
> best to allow generic type inferencing in cases where there's a type 
> specified (by any means) in the getAllIndexedFS method call.

I'd not say "by any means".

using JCas APIs:
1) FSIterator<TOP> getAllIndexedFS(aType);
2) <T extends TOP> FSIterator<T> getAllIndexedFS(Class<T> clazz)
3) <T extends TOP> FSIterator<T> getAllIndexedFS(aType)

I'd consider 1 and 2 to be safe and ok:
- 1 is guaranteed to return TOP or a subtype of it.
- 2 is quaranteed to return clazz or a subtype of it.

3 is not save:

FSIterator<Token> i = getAllIndexedFS(Sentence.type)

This causes a runtime error.

Question: except for history reasons, why do we need the "aType"
signature in a JCas context at all? Couldn't it be deprecated
in favor of the type-safe "clazz" variant?

-- Richard

On 08.07.2015, at 15:24, Marshall Schor <m...@schor.com> wrote:

> More about the signatures and type inference.
> 
> We have the following cases:
> 
>  (maybe) not JCas, using CAS APIs: 
>      (maybe because a JCas user might get a CAS - not a JCas - in some 
> routine)
> 
>    (no arguments in getAllIndexedFS)
>      FSIterator<...> getAllIndexedFS();
> 
>    (type argument in getAllIndexedFS) 
>      FSIterator<...> getAllIndexedFS(aType);
> 
>  using JCas APIs:
>    (no arguments in getAllIndexedFS)
>      FSIterator<...> getAllIndexedFS();
> 
>    (type argument in getAllIndexedFS) 
>      FSIterator<...> getAllIndexedFS(aType);
>      FSIterator<...> getAllIndexedFS(Class<Foo> clazz)
> 
> For the getAllIndexedFS() (no argument) kinds of calls, I think there's 
> agreement to use the generic FeatureStructure for the CAS APIs, and TOP for 
> the JCas APIs.
> 
> When the getAllIndexedFS is given type arguments, the method returns an 
> iterator over that type and its subtypes.  Here it seems best to use the JCas 
> type corresponding to the type argument.  This is easy to do in the last 
> case, above.  It can be "allowed" if the other calls use generic method forms 
> and pick up the type from the surrounding context.
> 
> The "pro" for doing this is that it makes UIMA more coder-friendly, by not 
> requiring the coder to "cast" the result.
> The "con" for doing this is that it allows the coder to make a mistake 
> (specifying the wrong type).  This would only be caught at run time.

Reply via email to