How can I add to List? extends Number data structures?
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.
In Java, generics provide a way to enforce type safety in collections. An important aspect of generics is their use with wildcard characters, particularly the use of bounded wildcards, such as List<? extends Number>. This type of wildcard specifies that the list can hold elements of a specific type or any subtype of that type. Here's an examination of how you can interact with such a data structure and why certain operations are limited.
Understanding List<? extends Number>
The <? extends Number> is a bounded wildcard which declares an upper bound, meaning the list can store objects that are of type Number or any subclass thereof, such as Integer, Double, or Float. The wildcard indicates some unknown type that extends Number.
Key Characteristics
- Readability: You can retrieve elements from this list safely in the sense that what you retrieve will definitely be a
Numberor a subclass. So, you can perform operations or methods available in theNumberclass on retrieved elements. - Write Limitations: You cannot add elements to a
List<? extends Number>due to the restrictions of bounded wildcards.
Why Adding Elements is Not Allowed
With List<? extends Number>, the exact type of the list is unspecified beyond it being a subtype of Number. Since the compiler cannot verify what specific Number subtype might be used, it restricts writing operations to prevent type safety violations.
To understand this better, consider:
The Java compiler prohibits this because it cannot ensure that the list expects an Integer when the wildcard could represent any subclass of Number.
Alternative Solutions
When you need to add elements, you must use a producer-consumer pattern or a more specific typing:
PECS: Producer Extends, Consumer Super
When dealing with generics in Java, the PECS principle helps guide whether to use extends or super. Here, it implies:
- Use
extendswhen you are producing and do not intend to mutate the data. - Use
superwhen consuming or mutating the data.
Example:
By using List<? super Number>, you inform the compiler that the list can accept any object of type Number or any supertype, thereby allowing additions.
When to Use List<?> vs List<? extends Number>
| Purpose | Use |
| General consumption | List<?> |
| Produce numbers | List<? extends Number> |
| Add numbers | List<? super Number> |
| Precise type operations | List<Type> (e.g., List<Integer>) |
Example Scenario
Consider a scenario where you're creating a method to sum all numbers in a list:
This method demonstrates how you can read from a List<? extends Number> efficiently to perform operations such as summation.
Conclusion
Understanding the behavior of bounded wildcards, such as List<? extends Number>, is crucial when designing method signatures and manipulating data structures in Java. The constraints imposed on adding elements serve to maintain type safety and ensure that methods consuming and producing data adhere to specified bounds. For flexibility and adding capabilities, consider using List<? super Number> to allow writing across subtypes of Number. These principles guide the effective use of Java generics, ensuring both flexibility and robustness in type-safe programming.
Related reading
- How can I automatically move messages off DLQ in Amazon SQS?
- How can I build a graph from a 2D array?
- How can I build an incremental directed acyclic word graph to store and search strings?
- How can I check if a key exists in a dictionary?
- How can I determine whether a Java class is abstract by reflection
- How can I implement ISerializable in .NET 4 without violating inheritance security rules?
- How can I clear or empty a StringBuilder?
- How can I combine two HashMap objects containing the same types?

DSA Fundamentals
Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.