Java中如何抑制已弃用的导入警告

137
在Java中,如果您导入一个已过时的类:
import SomeDeprecatedClass;

你会收到这样的警告:The type SomeDeprecatedClass is deprecated

有方法可以抑制这个警告吗?


4
是的,那会是理想情况,但在这种情况下,我正在使用一个Hadoop库,它使用了最近被弃用的API的一部分,所以如果我想使用这个库,我实际上没有选择余地。再加上这只是一个学校项目,并不需要维护。 - Ed Mazur
7个回答

229
为避免警告: 不要导入该类。 相反,使用完全限定的类名 尽可能少地在几个位置中使用它。

17
这应该是被采纳的答案。它有一个好处,就是不会压制整个类别的废弃警告。 - k_g
12
这是更好的答案,“@SuppressWarnings”在类级别上并不涵盖导入。 - Alex
8
这是截至Java 9之前最好的答案,直到这个问题最终得到修复:https://bugs.openjdk.java.net/browse/JDK-8032211。 - Christopher

155

将此注释用于您的类或方法:

@SuppressWarnings("deprecation")
自 Java 9 开始,您可能需要添加:
@SuppressWarnings("removal")

如果类被注解为:

@Deprecated(since = "3.14", forRemoval = true)

31
这个在导入语句中可用吗?我曾在方法等情况下使用过该注解,但在导入语句中好像不能识别。 - Ed Mazur
2
在类级别使用注释应该也包括导入。至少在Eclipse(好吧,对于我来说是Rational Application Developer)中是这样做的,但我不确定在命令行编译期间是否也是如此。 - craigforster
23
似乎在命令行的"javac"或者ant的<javac>任务中无法正常工作。-Xlint:-deprecation标志也不行。看起来是javac的一个bug。 - Archie
1
在IntelliJ IDEA(2017.1.3)中,注解可以抑制可视化警告,但不会从构建消息中删除它。 - Urhixidur
19
答案不应该在顶部,因为问题是关于 "import" 语句的,并且修复只适用于 Eclipse/Intellij(根据评论似乎是这样),但真正的来源是 javac,而修复不能在其中工作。 这个答案真正回答了问题:https://dev59.com/B3I-5IYBdhLWcg3wbXxN#20909204 - Ruslan
显示剩余3条评论

15

作为一种hack,您可以不导入并在代码中使用完全限定名称。

您也可以尝试javac -Xlint:-deprecation,不确定这是否会解决问题。


11

我通过更改导入为以下内容来解决这个问题:

import package.*

使用@SuppressWarnings("deprecation")注释已经弃用的类的方法。


不要从整个包中导入所有内容,这会影响性能。不必要的编译器将加载所有类,这将导致严重的性能问题。始终确保未使用的类不存在于您的导入中。 - Arundev
1
以百科全书为例(是的,我暴露了自己的年龄)- 如果你正在寻找有关猩猩的信息,你只是拿起“O”书还是拿起所有的书? - Ascalonian
@Arundev,你的意思是编译时间可能会更长,但在运行时,这不会对执行性能产生任何影响,是吗? - Paulo
@Paulo - 这就是我想说的,它会检查导入的类是否可用,即使它没有被使用。因此,如果您有很多未使用的导入,最好将其删除。 - Arundev

10
假设您正在覆盖/实现一个带有已弃用方法的接口(例如java.sql.ResultSet中的getUnicodeStream(String columnLabel)),那么仅使用注释@SuppressWarnings("deprecation")是无法消除弃用警告的,除非您还使用@Deprecated注释对同一新方法进行注释。这是合理的,因为否则您可以通过覆盖其接口描述来取消弃用方法。

这种"@SuppressWarnings"和"@Deprecated"的组合也适用于在自己的方法中调用已弃用的方法。 - Swav
1
我已经寻找那个解释很久了。谢谢! - user5063151

2
您可以使用以下命令:

javac FileName.java -Xlint:-deprecation

然后您将看到警告,并且知道哪部分代码导致了过时或使用过时的API。您可以带着这些警告运行代码,或者对代码进行适当修改。
例如,在我的情况下,我使用了 someListItem.addItem("red color"),但编译器希望我使用someListItem.add("red color");

1
如果@SuppressWarnings("deprecation")对您不起作用,就像对我一样。您可以在 sonar lint 插件中找到确切的鱿鱼编号。然后您可以简单地抑制警告:@SuppressWarnings("squid:CallToDeprecatedMethod")

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接