You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Daniel Sun (JIRA)" <ji...@apache.org> on 2018/08/18 10:03:00 UTC
[jira] [Comment Edited] (GROOVY-8409) Static compilation with
generic function wrapping BiFunction causes GroovyCastException
[ https://issues.apache.org/jira/browse/GROOVY-8409?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16584731#comment-16584731 ]
Daniel Sun edited comment on GROOVY-8409 at 8/18/18 10:02 AM:
--------------------------------------------------------------
The content of resolvedPlaceholders is shown as follows:
{code:java}
{R=T, T=java.util.Date, U=java.net.URL}
{code}
Note: the `T` of `R=T` is defined by user, but the `T` of `T=java.util.Date` is defined in `BiFunction`. As a result, R -> T -> Date
We should not just use generics name whose type is `String`.
The relevant code is:
{code:java}
//https://github.com/apache/groovy/blob/master/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java#L4954-L4957
Map<String, GenericsType> resolvedPlaceholders = resolvePlaceHoldersFromDeclaration(receiver, getDeclaringClass(method, arguments), method, method.isStatic());
if (!receiver.isGenericsPlaceHolder()) {
GenericsUtils.extractPlaceholders(receiver, resolvedPlaceholders);
}
{code}
was (Author: daniel_sun):
The content of resolvedPlaceholders is shown as follows:
{code:java}
{R=T, T=java.util.Date, U=java.net.URL}
{code}
Note: the `T` of `R=T` is defined by user, but the `T` of `T=java.util.Date` is defined in `BiFunction`. We should not just use generics name whose type is `String`.
The relevant code is:
{code:java}
//https://github.com/apache/groovy/blob/master/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java#L4954-L4957
Map<String, GenericsType> resolvedPlaceholders = resolvePlaceHoldersFromDeclaration(receiver, getDeclaringClass(method, arguments), method, method.isStatic());
if (!receiver.isGenericsPlaceHolder()) {
GenericsUtils.extractPlaceholders(receiver, resolvedPlaceholders);
}
{code}
> Static compilation with generic function wrapping BiFunction causes GroovyCastException
> ---------------------------------------------------------------------------------------
>
> Key: GROOVY-8409
> URL: https://issues.apache.org/jira/browse/GROOVY-8409
> Project: Groovy
> Issue Type: Bug
> Components: Static compilation
> Affects Versions: 2.4.8, 2.4.13
> Environment: MacOS Sierra 10.12.6
> Reporter: Shon Vella
> Priority: Major
> Attachments: Bug.groovy
>
>
> I have a statically compiled with a method declares Generic type T as it's return type and accepts a parameter of type java.util.function.BiFunction also with return type T. It makes a call to the passed in BiFunction and assigns the the result to a variable of type T.
> {code:java}
> static <T> T actionWrapperT(BiFunction<Date, URL, T> action) {
> T result = action.apply(new Date(), new URL('http://www.example.com'))
> // do something else here
> return result
> }
> {code}
> When actionWrapperT is called with runtime type of T as something other the Date, it causes a GroovyCastException.
> {panel}
> org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'XXX@71b1176b' with class 'XXX' to class 'java.util.Date'
> {panel}
> because it incorrectly tries to cast result type Date rather than to .
> It appears to me that the compiler is conflating generic type T as declared for the generic method with generic type T as declared by BiFunction<T,U,R> because if I change the name of the generic type of the generic method to R (to match the return type name of BiFunction) or to some other name not used by BiFunction, then it works correctly, but if I change it to U to match the second parameter of the BiFunction then it fails trying to cast to the BiFunction generic type U instead of the method generic type U.
> Problem does not happen under normal compilation or with only type checking enabled.
> Attached file Bug.groovy reproduces the problem.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)