RFR: JDK-8207224: Javac compiles source code despite illegal use of unchecked conversions

Vicente Romero vicente.romero at oracle.com
Sat Dec 1 19:46:33 UTC 2018


Please review fix for [1] at [2]. Javac is accepting this program as valid:

class ReturnTypeSubstitutableTest {
     abstract class AbstractDemo<Request extends AbstractResult, 
Response extends AbstractResult> {
         protected abstract Response test(Request request);
     }

     abstract interface AbstractResult {}

     abstract interface SimpleResult extends AbstractResult {}

     class Result1 implements SimpleResult {}

     class OtherResult implements AbstractResult {}

     public class SimpleDemo<Request extends AbstractResult, Response 
extends AbstractResult> extends AbstractDemo<Request, Response> {
         @Override
         protected SimpleResult test(AbstractResult request) {  
<----------- this method is accepted as a good override for 
AbstractDemo::test
             return null;
         }
     }
}

 From Dan's evaluation at the bug entry [1]:

Per JLS 8.4.8.3, the first method must be return-type-substitutable for 
the second. This can be satisfied in 3 ways (JLS 8.4.5):
- SimpleResult is a subtype of Response (no)
- SimpleResult can be converted to a subtype of Response by unchecked 
conversion (no)
- The methods have different signatures (yep) and SimpleResult = 
erasure(Response) (no)

No case applies, so an error should occur. This fix syncs javac with the 
spec.

Thanks,
Vicente

[1] https://bugs.openjdk.java.net/browse/JDK-8207224
[2] http://cr.openjdk.java.net/~vromero/8207224/webrev.00/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20181201/78287867/attachment.html>


More information about the compiler-dev mailing list