Bill Burcham created GEODE-6884:
-----------------------------------
Summary: 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
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)