diff --git a/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java b/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java
index c6a3e77..7252fc9 100644
--- a/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java
+++ b/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java
@@ -474,9 +474,12 @@
     {
         List<JavaType> expectedTypes = sourceType.getBindings().getTypeParameters();
         List<JavaType> actualTypes = actualType.getBindings().getTypeParameters();
-        for (int i = 0, len = expectedTypes.size(); i < len; ++i) {
+
+        final int actCount = actualTypes.size();
+
+        for (int i = 0, expCount = expectedTypes.size(); i < expCount; ++i) {
             JavaType exp = expectedTypes.get(i);
-            JavaType act = actualTypes.get(i);
+            JavaType act = (i < actCount) ? actualTypes.get(i) : unknownType();
 
             if (!_verifyAndResolvePlaceholders(exp, act)) {
                 // 14-May-2018, tatu: As per [databind#2034] it seems we better relax assignment
@@ -505,7 +508,7 @@
                     }
                 }
                 return String.format("Type parameter #%d/%d differs; can not specialize %s with %s",
-                        (i+1), len, exp.toCanonical(), act.toCanonical());
+                        (i+1), expCount, exp.toCanonical(), act.toCanonical());
             }
         }
         return null;
diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolution1964Test.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolutionTest.java
similarity index 70%
rename from src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolution1964Test.java
rename to src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolutionTest.java
index fa9ef01..1b29a77 100644
--- a/src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolution1964Test.java
+++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolutionTest.java
@@ -3,10 +3,13 @@
 import java.util.*;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
 import com.fasterxml.jackson.databind.*;
 
 /**
- * Test for [databind#1964], wherein slightly incompatible type hierarchy,
+ * Originally test for [databind#1964], wherein slightly incompatible type hierarchy,
  * where `Map` key is downcast from `String` to `Object` (via use of "raw"
  * types to force compiler to ignore incompatibility) causes exception
  * during serialization. Although ideally code would not force round peg
@@ -14,7 +17,7 @@
  * such downcast just for Map key types (for now at least).
  */
 @SuppressWarnings("serial")
-public class SubTypeResolution1964Test extends BaseMapTest
+public class SubTypeResolutionTest extends BaseMapTest
 {
     // [databind#1964]
     static class AccessModel {
@@ -65,7 +68,26 @@
     static class MetaAttribute<M, V, B> extends AbstractMetaValue<M, V, B> {
         public MetaAttribute() { }
       }
-    
+
+    // [databind#2632]: fail to specialize type-erased
+    @SuppressWarnings("rawtypes")
+    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
+    @JsonSubTypes(value = {
+                    @JsonSubTypes.Type(value = Either.Left.class, name = "left"),
+                    @JsonSubTypes.Type(value = Either.Right.class, name = "right")
+    })
+    static class Either<L, R> {
+        static class Left<T> extends Either {   }
+        static class Right<T> extends Either {  }
+    }
+
+    static class Foo {
+        @SuppressWarnings("unchecked")
+        public Either<String, String> getEither() {
+            return new Either.Right<String>();
+        }
+    }
+
     /*
     /**********************************************************************
     /* Unit tests
@@ -103,4 +125,21 @@
         // ... could/should verify more, perhaps, but for now let it be.
         assertNotNull(jsonStr);
     }
+
+    // [databind#2632]: fail to specialize type-erased
+    public void testSpecializeIncompatibleRawType() throws Exception
+    {
+        // 27-Feb-2020, tatu: First things first; incompatible typing should
+        //     cause reasonable exception
+        //  ... although since it's writing, perhaps should NOT fail at all?
+        String json;
+
+        try {
+            json = MAPPER.writeValueAsString(new Foo());
+            assertNotNull(json);
+            fail("Should not (yet?) pass");
+        } catch (JsonMappingException e) {
+            verifyException(e, "Failed to specialize base type ");
+        }
+    }
 }
