- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Java 没有文字映射语法,因此我正在尝试按文字初始化 map 的方法。编译器警告可能来自参数化可变参数类型的堆污染
,这对我来说是新的,所以我读到了这一点。我认为我可以安全地使用相关注释来抑制这些警告。但我有两个相关的问题。
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
安全地用作:
K
和V
参数类型在编译时在实例化时指定的泛型上受到限制 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/
我收到以下代码的警告:对最后一个参数的参数类型不精确的 varargs 方法进行非 varargs 调用;我该如何修复它? private static boolean checkImpled(Cl
我是一名学生,试图让这个回文检查器反射(reflect)输入的字符串是否确实是回文。我一直只返回一个结果,但我不明白为什么。不确定我的循环中是否遗漏了某些内容,或者我的循环中是否有不正确的内容。 pu
这个问题已经有答案了: Overloading function using varargs (3 个回答) 已关闭 6 年前。 为什么下面的代码给出编译错误“The method show(Obje
我的代码正在运行,但我收到了来自 Intelij 的警告(代码突出显示):不清楚是否需要可变参数或非可变参数调用。但代码确实完善了我想要的或我期望的,用值填充组合。当我单击组合中的项目时,它会返回正确
我在 JDK 1.8 上使用 IntelliJ IDEA 和 javac。我有以下代码: class Test { @SafeVarargs final void varargsMet
这在 Clojure 中相当简单 - (def a (partial println "Hello:")) (a "Bob") (a "Bob" "Ganesh") 但这在 Ruby 中似乎很难。 :
这个问题在这里已经有了答案: Why do I get a compilation warning here (var args method call in Java) (5 个答案) 关闭 6
这是我收到警告的示例代码。 Class aClass = Class.forName(impl); Method method = aClass.getMethod("getInstance", nu
使用 Java varargs 作为可选参数是否被认为是一个很好的编程习惯? 甚至更多:如果我有一个接口(interface),并且某些实现需要附加参数,而有些则不需要,是否可以在方法签名中为可选参数
像 printf 这样的可变参数函数如何找出它们得到的参数数量? 参数的数量显然不是作为(隐藏的)参数传递的(参见 call to printf in asm example here )。 有什么诀
Java 没有文字映射语法,因此我正在尝试按文字初始化 map 的方法。编译器警告可能来自参数化可变参数类型的堆污染,这对我来说是新的,所以我读到了这一点。我认为我可以安全地使用相关注释来抑制这些警告
public class OverloadingVarargsMethodWithNormalMethod { static void a(int... c){ Syste
我有以下定义某种类型的接口(interface) public interface BaseInterface { } 该接口(interface)将用于实现几个枚举,如下所示: public enu
我将 android Log 类包装在我自己的中 public static void d(String tag, String msg, long... varArgs) { Log.d(t
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试应用可变参数。我已经声明了一个需要无限数量变量的方法,如下所示: private Subject carMonitor; public AdvancedMonitor(Subject ...
我正在为 JVM 中的所有操作码编写一个枚举。它不完整,到目前为止看起来像这样: public enum Opcode { NOP(), ACONST_NULL(), ICON
这个问题在这里已经有了答案: Arrays.asList() not working as it should? (12 个答案) 关闭 5 年前。 在 Effective Java 中,J. Bl
我想选择性地调用函数或将其转换为字符串(打印出来)。以下不起作用: #if !defined(ENABLE_FUNCS) #define APPLY(func, ...) do { (func(__V
我有这个简单的 varargs 方法来划分列表中的每个项目: import java.util.*; class A { static long f(long... xs) { A
我是一名优秀的程序员,十分优秀!