Skip to content

Duplicate values cannot be added to JavaList via Add(index, item) #9675

Closed
@AdamEssenmacher

Description

@AdamEssenmacher

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:

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:

  1. JavaList is a wrapper over the native Java ArrayList, and relevant Java documentation indicates that Add() should always return true.
  2. Even if we were to reject the idea that JavaList should match the expected behavior of the underlying ArrayList, JavaList itself is not internally consistent in applying this constraint. Any other way of adding or setting elements to a JavaList does 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

Metadata

Metadata

Assignees

Labels

Area: Mono.AndroidIssues with the Android API binding (Mono.Android.dll).bugComponent does not function as intended.

Type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions