diff --git a/src/java.base/share/classes/java/util/HashMap.java b/src/java.base/share/classes/java/util/HashMap.java index de5ed2a596a..f7c7336d537 100644 --- a/src/java.base/share/classes/java/util/HashMap.java +++ b/src/java.base/share/classes/java/util/HashMap.java @@ -1217,8 +1217,8 @@ public boolean replace(K key, V oldValue, V newValue) { * mapping function modified this map */ @Override - public V computeIfAbsent(K key, - Function mappingFunction) { + public @Nullable V computeIfAbsent(K key, + Function mappingFunction) { if (mappingFunction == 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 bae2ba6cb81..49264e80042 100644 --- a/src/java.base/share/classes/java/util/Hashtable.java +++ b/src/java.base/share/classes/java/util/Hashtable.java @@ -1047,7 +1047,7 @@ public synchronized boolean replace(K key, V oldValue, V newValue) { * mapping function modified this map */ @Override - public synchronized V computeIfAbsent(K key, Function mappingFunction) { + public synchronized @Nullable V computeIfAbsent(K key, Function mappingFunction) { Objects.requireNonNull(mappingFunction); Entry tab[] = table; diff --git a/src/java.base/share/classes/java/util/Map.java b/src/java.base/share/classes/java/util/Map.java index 35c42270d4a..d0a74a03330 100644 --- a/src/java.base/share/classes/java/util/Map.java +++ b/src/java.base/share/classes/java/util/Map.java @@ -1081,8 +1081,9 @@ default boolean replace(K key, V oldValue, V newValue) { * ({@linkplain Collection##optional-restrictions optional}) * @since 1.8 */ - default V computeIfAbsent(K key, - Function mappingFunction) { + // We would use an annotation like @PolyNull here if JSpecify offered one. + default @Nullable V computeIfAbsent(K key, + Function mappingFunction) { Objects.requireNonNull(mappingFunction); V v; if ((v = get(key)) == null) { diff --git a/src/java.base/share/classes/java/util/Properties.java b/src/java.base/share/classes/java/util/Properties.java index ac78d947d95..e82d05b1c64 100644 --- a/src/java.base/share/classes/java/util/Properties.java +++ b/src/java.base/share/classes/java/util/Properties.java @@ -1502,8 +1502,8 @@ public synchronized boolean replace(Object key, Object oldValue, Object newValue } @Override - public synchronized Object computeIfAbsent(Object key, - Function mappingFunction) { + public synchronized @Nullable Object computeIfAbsent(Object key, + Function mappingFunction) { return map.computeIfAbsent(key, mappingFunction); } diff --git a/src/java.base/share/classes/java/util/TreeMap.java b/src/java.base/share/classes/java/util/TreeMap.java index 5ff5d22cdf6..17de6dabf97 100644 --- a/src/java.base/share/classes/java/util/TreeMap.java +++ b/src/java.base/share/classes/java/util/TreeMap.java @@ -595,7 +595,7 @@ final Entry getLowerEntry(K key) { * mapping function modified this map */ @Override - public V computeIfAbsent(K key, Function mappingFunction) { + public @Nullable V computeIfAbsent(K key, Function mappingFunction) { Objects.requireNonNull(mappingFunction); V newValue; Entry t = root; diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java index 458c2ba6e26..abde352c062 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java @@ -1725,7 +1725,7 @@ boolean removeValueIf(Predicate function) { * @throws RuntimeException or Error if the mappingFunction does so, * in which case the mapping is left unestablished */ - public V computeIfAbsent(K key, Function mappingFunction) { + public @Nullable V computeIfAbsent(K key, Function mappingFunction) { if (key == null || mappingFunction == null) throw new NullPointerException(); int h = spread(key.hashCode()); 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 f4e4084fd61..72950e912bd 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java @@ -328,8 +328,8 @@ default void replaceAll(BiFunction function) * @since 1.8 */ @Override - default V computeIfAbsent(K key, - Function mappingFunction) { + default @Nullable V computeIfAbsent(K key, + Function mappingFunction) { Objects.requireNonNull(mappingFunction); V oldValue, newValue; return ((oldValue = get(key)) == null diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java index ffe6b0fe54e..9d1f37a9777 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java @@ -1463,8 +1463,8 @@ else if ((d = h.down) != null) // remove levels * or the mappingFunction is null * @since 1.8 */ - public V computeIfAbsent(K key, - Function mappingFunction) { + public @Nullable V computeIfAbsent(K key, + Function mappingFunction) { if (key == null || mappingFunction == null) throw new NullPointerException(); V v, p, r;