Let's get started with a Microservice Architecture with Spring Cloud:
Resolving the “Cannot Instantiate the Type” Compilation Error
Last updated: March 26, 2026
1. Overview
In Java, certain types exist as blueprints rather than concrete implementations. If we attempt to instantiate any of these types using the new keyword, the compiler raises the error “Cannot instantiate the type.”
This compile-time error serves as a safeguard, ensuring we respect Java’s type system and abstraction principles. Understanding why Java prevents direct instantiation of certain types helps us write more robust code.
In this tutorial, we’ll learn what causes this error and how to resolve it for interfaces, abstract classes, and enums. We’ll also look at how sealed classes in Java 17+ add further constraints on type hierarchies.
2. Understanding the Error
The “Cannot instantiate the type” error indicates we’re trying to instantiate a type that Java doesn’t allow us to create directly. This restriction exists by design to maintain proper abstraction and type safety.
When we write code like the following, the compiler stops us:
List<String> list = new List<>(); // Cannot instantiate the type List
Java enforces this restriction because these types are intentionally incomplete or have special instantiation rules that prevent their use with the new keyword.
3. Common Causes
Let’s examine the three most common scenarios where this error occurs.
3.1. Attempting to Instantiate an Interface
Interfaces define contracts that classes must implement, but they contain no implementation themselves. Therefore, we cannot create instances of interfaces directly:
// This causes a compilation error
Map<String, Integer> scores = new Map<>();
Set<String> names = new Set<>();
The compiler rejects this code because Map and Set are interfaces. They specify what methods an implementing class must provide, but they don’t provide the actual implementation.
Since Java 8, interfaces can include default and static methods, but this doesn’t make them instantiable because interfaces can’t hold state, and they can still be used in multiple inheritance. This is why the compiled JVM artifacts are marked with the ACC_INTERFACE flag. Therefore, we cannot create instances of interfaces directly
3.2. Attempting to Instantiate an Abstract Class
Abstract classes are partially implemented classes that cannot be instantiated on their own. They often contain abstract methods that subclasses must implement:
public abstract class DataExporter {
protected String filename;
public abstract void export(List<String> data);
public String getFilename() {
return filename;
}
}
// This causes a compilation error
DataExporter exporter = new DataExporter(); // Cannot instantiate the type DataExporter
Since the DataExporter class has an abstract method export(), Java cannot create a complete instance of it. The class is intentionally incomplete, requiring a concrete subclass to provide the missing implementation.
3.3. Attempting to Instantiate an Enum
Enums have a fixed set of instances defined at compile time, and we cannot create new instances using the new keyword:
public enum Status {
ACTIVE, INACTIVE, PENDING
}
// This causes a compilation error
Status status = new Status(); // Cannot instantiate the type Status
Enum instances are created automatically by the JVM when the enum class loads. The constructor is implicitly private, preventing external instantiation.
4. How to Fix the Error?
The solution depends on the type we’re trying to instantiate.
For interfaces, we use a concrete implementation class:
List<String> list = new ArrayList<>();
Map<String, Integer> scores = new HashMap<>();
Set<String> names = new HashSet<>();
For abstract classes, we find or write a concrete subclass that implements all abstract methods:
public class CsvExporter extends DataExporter {
@Override
public void export(List<String> data) {
// Write data to CSV file
}
}
DataExporter exporter = new CsvExporter();
exporter.export(data);
And finally, we never instantiate enums; instead, we simply reference the predefined constants:
Status status = Status.ACTIVE;
5. Sealed Classes and Instantiation Constraints (Java 17+)
Java 17 introduced sealed classes, which add another layer of constraints on type hierarchies. A sealed class or interface restricts which classes can extend or implement it using the permits clause:
public sealed interface Shape permits Circle, Rectangle, Triangle {
double area();
}
With this declaration, only Circle, Rectangle, and Triangle can implement Shape. Like regular interfaces, we still can’t instantiate a sealed interface directly, but the set of permitted implementations is now explicitly controlled:
// This still causes a compilation error
Shape shape = new Shape();
// We must use one of the permitted implementations
Shape shape = new Circle(5.0);
Sealed classes work similarly. If we declare an abstract sealed class, only the permitted subclasses can extend it:
public abstract sealed class Payment permits CreditCardPayment, BankTransfer {
protected double amount;
}
// This still causes a compilation error
Payment payment = new Payment();
// We must use a permitted subclass
Payment payment = new CreditCardPayment(100.0);
Sealed types are especially useful with pattern matching, since the compiler knows the complete set of subtypes and can verify exhaustiveness in switch expressions.
6. Conclusion
In this article, we explored the “Cannot instantiate the type” compilation error in Java.
Firstly, we examined why Java prevents direct instantiation of certain types to maintain abstraction and type safety. Secondly, we identified the three common causes: attempting to instantiate interfaces, abstract classes, or enums.
We also learned how to resolve each case by using concrete implementations for interfaces, creating subclasses for abstract classes, and referencing enum constants directly.
The code backing this article is available on GitHub. Once you're logged in as a Baeldung Pro Member, start learning and coding on the project.















