diff --git a/pkl-core/src/main/java/org/pkl/core/runtime/VmReference.java b/pkl-core/src/main/java/org/pkl/core/runtime/VmReference.java
index e9a7ea3e3..6e0a25798 100644
--- a/pkl-core/src/main/java/org/pkl/core/runtime/VmReference.java
+++ b/pkl-core/src/main/java/org/pkl/core/runtime/VmReference.java
@@ -297,7 +297,8 @@ public final class VmReference extends VmValue {
var keyTypes = normalizeTypes(typeArgs[0], clazz, clazz.getModuleClass());
for (var kt : iterateTypes(keyTypes)) {
if (kt == UnknownType.INSTANCE
- || (kt instanceof VmType.ClassType klazz && klazz.getVmClass() == VmUtils.getClass(key))
+ || (kt instanceof VmType.ClassType klazz
+ && klazz.getVmClass().isSuperclassOf(VmUtils.getClass(key)))
|| (kt instanceof VmType.StringLiteralType stringLiteral
&& stringLiteral.getLiteral().equals(key))) {
normalizeTypes(typeArgs[1], clazz, clazz.getModuleClass(), result);
diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl
index 6cbcb80e8..37f2f00f3 100644
--- a/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl
+++ b/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl
@@ -125,6 +125,8 @@ aValuesJoined = k.aValues.join("\n")
typeArgs = ref.Reference(d, TypeHolder, null).prop as Ref
>
class TypeHolder {
prop: Listing
+ mappingAnyKey: Mapping
+ mappingTypeArgKey: Mapping, Int>
}
class BadResource extends Resource {
@@ -137,6 +139,12 @@ badThisRef = test.catch(() -> new BadResource { name = "bad" }.$.toString())
// test that a bare function type toStrings/exports okay
bareFunctionType = test.catch(() -> ref.Reference(d, Function4, null) as Ref)
+mappingAnyKey = ref.Reference(d, TypeHolder, null).mappingAnyKey["foo"]
+
+// this one should be an editor error but can't be caught in the runtime
+// because VmListing/VmMapping don't track their type args
+mappingTypeArgKey = ref.Reference(d, TypeHolder, null).mappingTypeArgKey[new Listing { "foo" }]
+
output {
renderer {
converters {
diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/api/reference.pcf b/pkl-core/src/test/files/LanguageSnippetTests/output/api/reference.pcf
index a54c668ef..f5bf9150c 100644
--- a/pkl-core/src/test/files/LanguageSnippetTests/output/api/reference.pcf
+++ b/pkl-core/src/test/files/LanguageSnippetTests/output/api/reference.pcf
@@ -62,3 +62,5 @@ aValuesJoined = """
typeArgs = "${null.prop}"
badThisRef = "Expected value of type `pkl.ref#Reference`, but got type `pkl.ref#Reference`. Value: Reference(new reference#D {}, reference#A, new reference#BadResource { name =..."
bareFunctionType = "Expected value of type `pkl.ref#Reference`, but got type `pkl.ref#Reference`. Value: Reference(new reference#D {}, Function4, null)"
+mappingAnyKey = "${null.mappingAnyKey[foo]}"
+mappingTypeArgKey = "${null.mappingTypeArgKey[new Listing { \"foo\" }]}"