Java Plugin Incremental Compilation Dependencies Question

I created some simple tests to look into what gets recompiled when small changes are made to code. In one example I have the following dependencies:

Continent → Country → State → City

After doing a build and making sure everything is up-to-date, I add a method to City.java. All 4 classes in this dependency graph are recompiled, and I don’t understand why. It seems to me that it would make sense to recompile City.java (because it changed) and State.java (because it references City.java). The code can be found here: gradledeps/incremental-compilation-and-compile-avoidance/simplelibclient/src/main/java/com/simplelibclient/hierarchy at master · nestedsoftware/gradledeps · GitHub

Interestingly, if I replace the concrete class dependencies with interfaces, it’s much better. Starting from everything built, adding a method to CityIF.java and City.java, we compile City.java, CityIF.java, and State.java, but nothing else. The code can be found here: gradledeps/incremental-compilation-and-compile-avoidance/simplelibclient/src/main/java/com/simplelibclient/interfacehierarchy at master · nestedsoftware/gradledeps · GitHub

Non-interface compilation:

[DEBUG] [org.gradle.internal.execution.history.OutputsCleaner] Deleting stale output file '<project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\classes\java\main\com\simplelibclient\hierarchy\City.class'.
[DEBUG] [org.gradle.internal.execution.history.OutputsCleaner] Deleting stale output file '<project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\classes\java\main\com\simplelibclient\hierarchy\Continent.class'.
[DEBUG] [org.gradle.internal.execution.history.OutputsCleaner] Deleting stale output file '<project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\classes\java\main\com\simplelibclient\hierarchy\Country.class'.
[DEBUG] [org.gradle.internal.execution.history.OutputsCleaner] Deleting stale output file '<project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\classes\java\main\com\simplelibclient\hierarchy\State.class'.
[INFO] [org.gradle.jvm.toolchain.internal.DefaultToolchainJavaCompiler] Compiling with toolchain 'C:\Program Files\Java\jdk-11.0.8'.
[DEBUG] [org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler] Compiler arguments: -source 11 -target 11 -d <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\classes\java\main -h <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\generated\sources\headers\java\main -g -sourcepath  -proc:none -s <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\generated\sources\annotationProcessor\java\main -XDuseUnsharedTable=true -classpath <project root>\incremental-compilation-and-compile-avoidance\simplelib\build\classes\java\main;<project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\classes\java\main <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\src\main\java\com\simplelibclient\hierarchy\City.java <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\src\main\java\com\simplelibclient\hierarchy\Continent.java <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\src\main\java\com\simplelibclient\hierarchy\Country.java <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\src\main\java\com\simplelibclient\hierarchy\State.java
[INFO] [org.gradle.api.internal.tasks.compile.JdkJavaCompiler] Compiling with JDK Java compiler API.
[INFO] [org.gradle.api.internal.tasks.compile.incremental.SelectiveCompiler] Incremental compilation of 4 classes completed in 0.187 secs.

Interface compilation:

[INFO] [org.gradle.internal.execution.steps.SkipUpToDateStep] Task ':simplelibclient:compileJava' is not up-to-date because:
  Input property 'stableSources' file <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\src\main\java\com\simplelibclient\interfacehierarchy\City.java has changed.
  Input property 'stableSources' file <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\src\main\java\com\simplelibclient\interfacehierarchy\CityIF.java has changed.
[INFO] [org.gradle.api.internal.tasks.compile.incremental.classpath.ClasspathSnapshotMaker] Created classpath snapshot for incremental compilation in 0.001 secs.
[DEBUG] [org.gradle.api.internal.tasks.compile.incremental.classpath.ClasspathSnapshotMaker] While calculating classpath snapshot 0 duplicate classes were found: [].
[INFO] [org.gradle.api.internal.tasks.compile.incremental.recomp.PreviousCompilationOutputAnalyzer] Class dependency analysis for incremental compilation took 0.006 secs.
[DEBUG] [org.gradle.internal.execution.history.OutputsCleaner] Deleting stale output file '<project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\classes\java\main\com\simplelibclient\interfacehierarchy\City.class'.
[DEBUG] [org.gradle.internal.execution.history.OutputsCleaner] Deleting stale output file '<project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\classes\java\main\com\simplelibclient\interfacehierarchy\CityIF.class'.
[DEBUG] [org.gradle.internal.execution.history.OutputsCleaner] Deleting stale output file '<project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\classes\java\main\com\simplelibclient\interfacehierarchy\State.class'.
[INFO] [org.gradle.jvm.toolchain.internal.DefaultToolchainJavaCompiler] Compiling with toolchain 'C:\Program Files\Java\jdk-11.0.8'.
[DEBUG] [org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler] Compiler arguments: -source 11 -target 11 -d <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\classes\java\main -h <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\generated\sources\headers\java\main -g -sourcepath  -proc:none -s <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\generated\sources\annotationProcessor\java\main -XDuseUnsharedTable=true -classpath <project root>\incremental-compilation-and-compile-avoidance\simplelib\build\classes\java\main;<project root>\incremental-compilation-and-compile-avoidance\simplelibclient\build\classes\java\main <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\src\main\java\com\simplelibclient\interfacehierarchy\City.java <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\src\main\java\com\simplelibclient\interfacehierarchy\CityIF.java <project root>\incremental-compilation-and-compile-avoidance\simplelibclient\src\main\java\com\simplelibclient\interfacehierarchy\State.java
[INFO] [org.gradle.api.internal.tasks.compile.JdkJavaCompiler] Compiling with JDK Java compiler API.
[INFO] [org.gradle.api.internal.tasks.compile.incremental.SelectiveCompiler] Incremental compilation of 3 classes completed in 0.188 secs.