gpt4 book ai didi

java - Varargs 污染了堆

转载 作者:行者123 更新时间:2023-12-02 11:46:37 26 4
gpt4 key购买 nike

Java 没有文字映射语法,因此我正在尝试按文字初始化 map 的方法。编译器警告可能来自参数化可变参数类型的堆污染,这对我来说是新的,所以我读到了这一点。我认为我可以安全地使用相关注释来抑制这些警告。但我有两个相关的问题。

  1. 我认为在这种情况下可以取消警告吗? (对于下面的代码)
  2. 为什么 keys 方法需要两个注释?省略其中任何一个都会让我看到“堆污染”警告的变化,但两者对我来说听起来都是一样的。

您不必批评代码。我只是在玩。

这是代码。

import java.util.*;

public class MapMaker<K, V>{
private K [] m_keys;

@SafeVarargs
@SuppressWarnings("varargs")
public final MapMaker<K, V> keys( final K... keys ){
m_keys = keys;
return this;
}

@SafeVarargs
public final Map<K, V> values( final V... values ){
if ( values.length != m_keys.length )
throw new IllegalArgumentException( "Mismatch - keys: " + m_keys.length + ", values " + values.length );

final Map<K, V> result = new HashMap<>();

for ( int i = 0; i < m_keys.length; i++ )
result.put( m_keys[ i ], values[ i ] );

return result;
}

public static void main( String [] args ){
final Map<Integer, String> mapIntStr = new MapMaker<Integer, String>()
.keys ( 1, 2, 3 )
.values( "One", "Two", "Three" );

System.out.println( mapIntStr );

final Map<String, String> mapStrStr = new MapMaker<String, String>()
.keys ( "1" )
.values( "One", "Two" );
}
}

输出为

{1=One, 2=Two, 3=Three}
Exception in thread "main" java.lang.IllegalArgumentException: Mismatch - keys: 1, values 2
at MapMaker.values(MapMaker.java:16)
at MapMaker.main(MapMaker.java:35)

最佳答案

Am I right that it's ok to suppress the warnings in this case?

这里是Varargs安全地用作:

  • KV参数类型在编译时在实例化时指定的泛型上受到限制 MapMaker :

    final Map<Integer, String> mapIntStr = new MapMaker<Integer, String>()

  • 您不会使用 vargs 变量执行不安全的转换,也不会将它们分配给已声明的 Object[]数组以使用可能导致 java.lang.ArrayStoreException 不兼容的对象对其进行值(这不是堆污染,但这也是有问题的)。

  • 您使用的是泛型数组,而不是泛型集合的数组。堆污染在此配置中不太常见,因为您没有可能包含可能触发 ClassCastException 的不兼容元素的集合。 .

所以是的@SafeVarargs有道理。

<小时/>

Why do I need two annotations for the keys method?

注释keys()方法与这两种方法:

@SafeVarargs
@SuppressWarnings("varargs")

不应该是必需的。

@SafeVarargs java.lang.SafeVarargs 确实足够了javadoc 指出:

Applying this annotation to a method or constructor suppresses unchecked warnings about a non-reifiable variable arity (vararg) type and suppresses unchecked warnings about parameterized array creation at call sites.

您可能应该检查您的 IDE 配置。
我用 javac 进行了测试仅使用 @SafeVarargs 不会发出警告注释。

关于java - Varargs 污染了堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48153591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com