From f67b7683c0fc5416f1bfcc5aba24cc0dc41b8b36 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Wed, 27 May 2026 14:06:11 -0400 Subject: [PATCH] Standardize second input for `compute` `BiFunction` on `? super @Nullable V`. That is already how we have it in `Map` and `ConcurrentHashMap`. It also matches JSpecify. I haven't tried to correct anything else in these signatures, some of which are in internal APIs that we don't need to annotate. I'm happy to revert such APIs if you'd like. --- src/java.base/share/classes/java/util/Collections.java | 10 +++++----- src/java.base/share/classes/java/util/HashMap.java | 2 +- src/java.base/share/classes/java/util/Hashtable.java | 2 +- src/java.base/share/classes/java/util/TreeMap.java | 2 +- .../classes/java/util/concurrent/ConcurrentMap.java | 2 +- .../DelegatingIteratorForEachRemaining.java | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/java.base/share/classes/java/util/Collections.java b/src/java.base/share/classes/java/util/Collections.java index 2221172db9c..0577a5d9a96 100644 --- a/src/java.base/share/classes/java/util/Collections.java +++ b/src/java.base/share/classes/java/util/Collections.java @@ -1653,7 +1653,7 @@ public V replace(K key, V value) { @Override public @PolyNull V compute(K key, - BiFunction remappingFunction) { + BiFunction remappingFunction) { throw new UnsupportedOperationException(); } @@ -2863,7 +2863,7 @@ public V replace(K key, V value) { } @Override public @PolyNull V compute(K key, - BiFunction remappingFunction) { + BiFunction remappingFunction) { synchronized (mutex) {return m.compute(key, remappingFunction);} } @Override @@ -3957,7 +3957,7 @@ public V replace(K key, V value) { @Override public @PolyNull V compute(K key, - BiFunction remappingFunction) { + BiFunction remappingFunction) { return m.compute(key, typeCheck(remappingFunction)); } @@ -4971,7 +4971,7 @@ public V replace(K key, V value) { @Override public @PolyNull V compute(K key, - BiFunction remappingFunction) { + BiFunction remappingFunction) { throw new UnsupportedOperationException(); } @@ -5322,7 +5322,7 @@ public V replace(K key, V value) { @Override public @PolyNull V compute(K key, - BiFunction remappingFunction) { + BiFunction remappingFunction) { throw new UnsupportedOperationException(); } diff --git a/src/java.base/share/classes/java/util/HashMap.java b/src/java.base/share/classes/java/util/HashMap.java index 5a3ab1d02d6..5ba7bec54d8 100644 --- a/src/java.base/share/classes/java/util/HashMap.java +++ b/src/java.base/share/classes/java/util/HashMap.java @@ -1331,7 +1331,7 @@ else if (t != null) */ @Override public @PolyNull V compute(K key, - BiFunction remappingFunction) { + BiFunction remappingFunction) { if (remappingFunction == null) throw new NullPointerException(); int hash = hash(key); diff --git a/src/java.base/share/classes/java/util/Hashtable.java b/src/java.base/share/classes/java/util/Hashtable.java index 16d89d0a9f8..d6567bb2638 100644 --- a/src/java.base/share/classes/java/util/Hashtable.java +++ b/src/java.base/share/classes/java/util/Hashtable.java @@ -1151,7 +1151,7 @@ public synchronized boolean replace(K key, V oldValue, V newValue) { * remapping function modified this map */ @Override - public synchronized @PolyNull V compute(K key, BiFunction remappingFunction) { + public synchronized @PolyNull V compute(K key, BiFunction remappingFunction) { Objects.requireNonNull(remappingFunction); Entry tab[] = table; diff --git a/src/java.base/share/classes/java/util/TreeMap.java b/src/java.base/share/classes/java/util/TreeMap.java index da264a0d9eb..f1e880ec235 100644 --- a/src/java.base/share/classes/java/util/TreeMap.java +++ b/src/java.base/share/classes/java/util/TreeMap.java @@ -1878,7 +1878,7 @@ public V computeIfAbsent(K key, Function mappingFunction return m.computeIfAbsent(key, mappingFunction); } - public V compute(K key, BiFunction remappingFunction) { + public V compute(K key, BiFunction remappingFunction) { if (!inRange(key)) { // Do not throw if remapping function returns null // to preserve compatibility with default computeIfAbsent implementation diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java index 6726489e1fb..2416ff627ab 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java @@ -424,7 +424,7 @@ default void replaceAll(BiFunction function) */ @Override default @PolyNull V compute(K key, - BiFunction remappingFunction) { + BiFunction remappingFunction) { retry: for (;;) { V oldValue = get(key); // if putIfAbsent fails, opportunistically use its return value diff --git a/test/jdk/java/util/Collections/DelegatingIteratorForEachRemaining.java b/test/jdk/java/util/Collections/DelegatingIteratorForEachRemaining.java index 65bd0b943dd..9ede9ddd08b 100644 --- a/test/jdk/java/util/Collections/DelegatingIteratorForEachRemaining.java +++ b/test/jdk/java/util/Collections/DelegatingIteratorForEachRemaining.java @@ -142,7 +142,7 @@ public ForwardingMap(Map delegate) { @Override public V replace(K key, V value) { return delegate.replace(key, value); } @Override public V computeIfAbsent(K key, Function mappingFunction) { return delegate.computeIfAbsent(key, mappingFunction); } @Override public V computeIfPresent(K key, BiFunction remappingFunction) { return delegate.computeIfPresent(key, remappingFunction); } - @Override public V compute(K key, BiFunction remappingFunction) { return delegate.compute(key, remappingFunction); } + @Override public V compute(K key, BiFunction remappingFunction) { return delegate.compute(key, remappingFunction); } @Override public V merge(K key, V value, BiFunction remappingFunction) { return delegate.merge(key, value, remappingFunction); } }