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)

Reply via email to