[
https://issues.apache.org/jira/browse/GEODE-6884?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16866072#comment-16866072
]
Joris Melchior commented on GEODE-6884:
---------------------------------------
Yes, there are issues with the fix we provided. I clearly should not have
rushed this and taken a step back. Will have to roll that back.
> Execution.withFilter() and friends introduce type parameters inconsistent
> with class' type parameters
> -----------------------------------------------------------------------------------------------------
>
> Key: GEODE-6884
> URL: https://issues.apache.org/jira/browse/GEODE-6884
> Project: Geode
> Issue Type: Bug
> Reporter: Bill Burcham
> Priority: Major
>
> A recent change to {{Execution}} changed {{withFilter()}} and friends so they
> introduce their own type parameters:
> {code:java}
> <ArgumentT, ReturnT, AggregatorT> Execution<ArgumentT, ReturnT,
> AggregatorT> withFilter(
> Set<?> filter);
> {code}
> This eliminates a compile error over in {{FunctionRetryTestBase}} where
> chaining was happening:
> {code:java}
> final Execution<Integer, Long, List<Long>> execution;
> switch (executionTarget) {
> case REGION:
> execution =
>
> FunctionService.onRegion(clusterStartupRule.getClientCache().getRegion(regionName))
> .setArguments(200);
> {code}
> Unfortunately though, this change introduces a "hole" in the typing so that
> the client (of {{Execution}}) is able to produce instances parameterized on
> arbitrary types. The compiler is happy with just about anything, but runtime
> exceptions ({{ClassCastException}}) will ensue.
> Here is an example of code that compiles
> [https://gist.github.com/Bill/5e2ad2ba4b60461dd0af8adfa4adc91b:]
> {code:java}
> final Execution<String, String, String> execution =
> FunctionService.onRegion(null);
>
> //Add a string argument, which appears to be typesafe
> final Execution<String, String, String> addedArgument =
> execution.setArguments("hello");
> //But wait! If we call withFilter, we get to change the type of Execution
> with no warning
> //or casts. We won't see the class cast exceptions until runtime.
> final Execution<Integer, Integer, Integer> execution1 =
> execution.withFilter(Collections.singleton(5));
> {code}
>
> A hint at the problem is that IntelliJ inspections highlights the new type
> parameters on e.g. the {{withFilter()}} method indicating that the type
> parameters on the method are hiding the type parameters on the class. This is
> an indication that even though the names are the same—the type parameters to
> the method are completely different from the ones on the class. There is no
> enforced correspondence. The compiler gives you complete freedom here.
>
> !image-2019-06-17-16-11-39-678.png!
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)