Describe the bug
DataFetchingEnvironment#getDataLoader exposes DataLoader values as non-null to Kotlin in graphql-java 25, even though java-dataloader 6 allows nullable value type parameters.
DataFetchingEnvironment is now @NullMarked, and getDataLoader is declared as:
@Nullable
<K, V> DataLoader<K, V> getDataLoader(String dataLoaderName);
Kotlin reads this as:
fun <K : Any, V : Any> getDataLoader(dataLoaderName: String): DataLoader<K, V>?
This prevents using V?, even though org.dataloader.DataLoader itself allows
DataLoader<K, V extends @Nullable Object>
CompletableFuture<V> load(...)
So DataLoader<K, V?> is valid for java-dataloader but cannot be retrieved through DataFetchingEnvironment#getDataLoader without unchecked casts.
To Reproduce
fun fetchUniversity(dfe: DataFetchingEnvironment): CompletableFuture<University?> {
val loader = dfe.getDataLoader<Int, University?>("UniversityDataLoader")
return loader.load(1)
}
With GraphQL Java 25, this fails to compile in Kotlin:
Type argument is not within its bounds: must be subtype of 'Any'
A workaround requires retrieving as Any and casting:
@Suppress("UNCHECKED_CAST")
fun fetchUniversity(dfe: DataFetchingEnvironment): CompletableFuture<University?> {
val loader = dfe.getDataLoader<Int, Any>("UniversityDataLoader") as DataLoader<Int, University?>
return loader.load(1)
}
Expected Behavior
getDataLoader should preserve java-dataloader nullable value bound, likely something like:
@Nullable
<K extends Object, V extends @Nullable Object> DataLoader<K, V> getDataLoader(String dataLoaderName);
Describe the bug
DataFetchingEnvironment#getDataLoaderexposesDataLoadervalues as non-null to Kotlin ingraphql-java25, even thoughjava-dataloader6 allows nullable value type parameters.DataFetchingEnvironmentis now@NullMarked, andgetDataLoaderis declared as:Kotlin reads this as:
This prevents using
V?, even thoughorg.dataloader.DataLoaderitself allowsSo DataLoader<K, V?> is valid for java-dataloader but cannot be retrieved through DataFetchingEnvironment#getDataLoader without unchecked casts.
To Reproduce
With GraphQL Java 25, this fails to compile in Kotlin:
A workaround requires retrieving as Any and casting:
Expected Behavior
getDataLoadershould preservejava-dataloadernullable value bound, likely something like: