-
Notifications
You must be signed in to change notification settings - Fork 564
Description
Android framework version
net9.0-android
Affected platform version
All Platforms/Versions
Description
When calling either Add(Java.Lang.Object item) or Add(int index, Java.Lang.Object item) on a JavaList, duplicate values cannot be added to the list.
Offending code:
android/src/Mono.Android/Android.Runtime/JavaList.cs
Lines 548 to 559 in dff6de5
| public virtual bool Add (Java.Lang.Object? item) | |
| { | |
| return Add (0, item); | |
| } | |
| public virtual bool Add (int index, Java.Lang.Object? item) | |
| { | |
| if (Contains (item)) | |
| return false; | |
| Add ((object?) item); | |
| return true; | |
| } |
I believe this is incorrect behavior for two reasons:
JavaListis a wrapper over the native JavaArrayList, and relevant Java documentation indicates thatAdd()should always return true.- Even if we were to reject the idea that
JavaListshould match the expected behavior of the underlyingArrayList,JavaListitself is not internally consistent in applying this constraint. Any other way of adding or setting elements to aJavaListdoes not reject duplicate elements
It looks like it has been like this since at least 2016, and I wouldn't be surprised if there are consumers out there accidentally relying on this behavior. I recommend marking the two offending methods obsolete, and replacing them with correctly behaving methods with close-enough names like AddItem.
Quick Edit: Example of this causing a real problem in the wild (and what brought it to my attention).
Steps to Reproduce
Use either Add(Java.Lang.Object item) or Add(int index, Java.Lang.Object item) to add duplicate values (e.g. "foo") repeatedly to a JavaList.
Did you find any workaround?
Adding or setting elements to JavaList through any other available method (e.g. Insert, Set, Add(JavaList collection) allows duplicate values to be added.
Relevant log output
None