- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 JDK 1.8 上使用 IntelliJ IDEA 和 javac。我有以下代码:
class Test<T extends Throwable>
{
@SafeVarargs
final void varargsMethod( Collection<T>... varargs )
{
arrayMethod( varargs );
}
void arrayMethod( Collection<T>[] args )
{
}
}
IntelliJ IDEA 不会高亮上述代码中的任何内容作为警告。但是,在编译时,“消息” View 的“制作”选项卡中会出现以下行:
Warning:(L, C) java: Varargs method could cause heap pollution from non-reifiable varargs parameter varargs
注意#1:我已经指定了@SafeVarargs
。
注意 #2:Warning:(L,C)
指向 varargs
作为参数传递给 arrayMethod()
假设我知道我在做什么,并且假设我非常确定不会有堆污染,或者我保证我不会以某种可能导致堆污染的时髦方式调用此方法,我需要做什么才能禁止显示此警告消息?
注意:stackoverflow 上有很多关于可变参数方法的问题,但似乎没有一个可以解决这个特定问题。事实上,整个 interwebz 似乎都无法很好地回答这个特定问题。
最佳答案
在我看来,关于这个问题的答案都不是令人满意的,所以我想尝试一下。
这是我的看法:
@SafeVarargs
[unchecked] Possible heap pollution from parameterized vararg type Foo
.@SuppressWarnings("varargs")
[varargs] Varargs method could cause heap pollution from non-reifiable varargs parameter bar
.因此,如果我对 OP 的原始代码进行以下简单修改:
class Foo {
static <T> void bar(final T... barArgs) {
baz(barArgs);
}
static <T> void baz(final T[] bazArgs) { }
}
$ javac -Xlint:all Foo.java
的输出使用 Java 9.0.1 编译器是:
Foo.java:2: warning: [unchecked] Possible heap pollution from parameterized vararg type T
static <T> void bar(final T... barArgs) {
^
where T is a type-variable:
T extends Object declared in method <T>bar(T...)
1 warning
我可以通过标记 bar()
使警告消失作为@SafeVarargs
.这既使警告消失又,通过向方法契约添加可变参数安全性,确保任何调用bar
的人。不必抑制任何可变参数警告。
然而,它也让 Java 编译器更仔细地查看方法代码本身——我想是为了验证 bar()
的简单情况。可能违反了我刚刚与 @SafeVarargs
签订的契约(Contract).它看到 bar()
调用 baz()
路过barArgs
自baz()
以来的数字需要 Object[]
由于类型删除,baz()
可能会弄乱堆,从而导致 bar()
以传递方式进行。
所以我还需要添加 @SuppressWarnings("varargs")
至 bar()
发出关于 bar()
的警告的代码消失了。
关于Java 警告 : Varargs method could cause heap pollution from non-reifiable varargs parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28914088/
我收到以下代码的警告:对最后一个参数的参数类型不精确的 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
我是一名优秀的程序员,十分优秀!