fmidev / fmi-avi-messageconverter

API classes for aviation weather message handling
MIT License
4 stars 6 forks source link

FreeBuilder builders implementing an interface compile only with Java 8 #77

Open petringo opened 3 years ago

petringo commented 3 years ago

When a declared builder of a FreeBuilder class implements an interface, it compiles ok with Java 8 compiler, but Java 11 compiler aborts with an error like

[ERROR] fmi-avi-messageconverter/target/generated-sources/annotations/fi/fmi/avi/model/metar/immutable/SPECIImpl_Builder.java:[180,32] incompatible types: fi.fmi.avi.model.metar.immutable.SPECIImpl_Builder cannot be converted to fi.fmi.avi.model.metar.immutable.SPECIImpl.Builder

In the example above, SPECIImpl.Builder is declared as

public static class Builder extends SPECIImpl_Builder implements MeteorologicalTerminalAirReportBuilder<SPECIImpl, Builder>

and MeteorologicalTerminalAirReportBuilder as

public interface MeteorologicalTerminalAirReportBuilder<T extends MeteorologicalTerminalAirReport, B extends MeteorologicalTerminalAirReportBuilder<T, B>>

and generated SPECIImpl_Builder as

abstract class SPECIImpl_Builder

Methods of SPECIImpl_Builder return (SPECIImpl.Builder) this. Java 11 compiler sees that SPECIImpl_Builder does not implement MeteorologicalTerminalAirReportBuilder as SPECIImpl.Builder does, and refuses to do a static cast raising an error. Java 8 compiler doesn't seem to do this check and compilation succeeds. Though a compiled class runs correctly under JRE 11.

The MeteorologicalTerminalAirReportBuilder interface is implemented by METARImpl.Builder and SPECIImpl.Builder to enable use of the builder through a common interface, allowing to deduplicate code using these builders.

FreeBuilder version: 2.3.0

Find out how to make this project compile with Java 11 compiler.