-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Description
The current signature of JsonNode#deepCopy looks like this:
public abstract <T extends JsonNode> T deepCopy();
I wondered about the decision to do this as you can quite easily create a ClassCastException using this as follows:
TextNode text = TextNode.valueOf("SomeText");
ObjectNode object = text.deepCopy();
This code is obviously incorrect just by looking at it however this will always compile and throw an exception at runtime. I know this is considered an API change but a signature that prevents this might be:
JsonNode.java
public abstract JsonNode deepCopy();
And then be overridden on each subclass with the correct type
ValueNode.java
public abstract ValueNode deepCopy();
After looking at this again, the signatures of ObjectNode and ArrayNode are correct but you can still trick it by upcasting to JsonNode and then using deepCopy()
Activity
cowtowncoder commentedon Nov 16, 2017
Hmmh. Yes, it would be possible to use return type co-variance here. This could be done for Jackson 3.x (as it can not be done for 2.x; not something that can go in a patch, and 2.9 is the last 2.x minor version).
cowtowncoder commentedon Jul 28, 2022
lol on "2.9 is the last". We are at 2.13 now... :)
Still, if done, this needs to go in 3.0.
[-]JsonNode#deepCopy ClassCast Exceptions[/-][+]`JsonNode.deepCopy() `ClassCastException`s[/+]Fix #1829: change `JsonNode.deepCopy()` return type to safer
Fix #1829: change `JsonNode.deepCopy()` return type to safer (#4832)
cowtowncoder commentedon Dec 12, 2024
Fixed.