Придушити застаріле попередження про імпорт на Java


111

У Java, якщо ви імпортуєте застарілий клас:

import SomeDeprecatedClass;

Ви отримуєте це попередження: The type SomeDeprecatedClass is deprecated

Чи є спосіб придушити це попередження?


4
Так, це було б ідеально, але в цьому випадку я використовую бібліотеку для Hadoop, яка використовує частину свого API, яка була нещодавно застаріла, тому я не маю вибору, чи хочу я використовувати цю бібліотеку. Плюс це лише для шкільного проекту, а не всього, що потрібно буде підтримувати.
Ед Мазур

Відповіді:


129

Використовуйте цю примітку у класі чи методі:

@SuppressWarnings( "deprecation" )

29
Це працює з імпортом? Я використав цю анотацію щодо методів тощо, але вона, схоже, не визнається при імпорті.
Ед Мазур

2
Використання примітки на рівні класу також повинно охоплювати імпорт. Це робиться для мене щонайменше в межах Eclipse (ну, Rational Application Developer), але я не впевнений в цьому під час компіляції командного рядка.
craigforster

20
Схоже, це не працює з командним рядком "javac" або завданням мураха <javac>. Ні прапор -Xlint: -deprecation. Схоже на помилку javac.
Арчі

1
Не працює, якщо депресія є частиною статичного поля та локальних SuppressWarnings. Краще підходить назва класу.
mheinzerling

16
Відповідь не повинна бути вгорі, оскільки питання стосується заяви "імпорту", а виправлення працює лише для Eclipse / Intellij (здається, згідно з коментарями), але найвищим джерелом істини є javac, для якого виправлено не працює. Ця відповідь справді відповідає на питання: stackoverflow.com/a/20909204/2032701
Руслан

179

Щоб уникнути попередження: не імпортуйте клас

замість цього використовуйте повністю кваліфіковану назву класу

і використовувати його в якомога менше місцях.


15
+1 Це має бути прийнятою відповіддю. Це має перевагу в тому, що не пригнічувати застарілість у всьому класі.
k_g

11
Це краща відповідь, @SuppressWarningsна рівні класу не охоплює імпорт
Алекс

7
Це найкраща відповідь до Java 9, де вона остаточно виправлена: bugs.openjdk.java.net/browse/JDK-8032211
Крістофер

14

Як хак, ви не можете виконати імпорт і використовувати повноцінне ім’я всередині коду.

Ви також можете спробувати javac -Xlint: -визначення не впевнений, чи вирішить це.


9

Я вирішив це, змінивши імпорт на:

import package.*

потім коментуючи метод, за допомогою якого використовуються застарілі класи@SuppressWarnings("deprecation")


Не імпортуйте все з усієї упаковки. Це вплине на продуктивність. Непотрібний компілятор буде завантажувати всі класи, це призведе до серйозної проблеми продуктивності. Завжди використовуйте, що невикористані класи відсутні у вашому імпорті.
Арундев

1
Використовуючи енциклопедію як приклад тут (так, я датував себе) - якщо ви шукаєте інформацію про орангутана, ви просто захопите книгу "О" або захопите всі книги?
Аскалонія

@Arundev, щоб було зрозуміло, що ви говорите, це те, що компіляція може зайняти більше часу, але під час виконання це не вплине на ефективність виконання, правда?
Пауло

@Paulo - ось що я намагаюся сказати, він перевірить наявність імпортних класів, навіть якщо він не використовується. Тож якщо у вас багато невикористаного імпорту, завжди краще видалити це.
Арундев

7

Припустимо, що ви переосмислюєте / реалізуєте інтерфейс із застарілим методом (наприклад, getUnicodeStream (String columnLabel) в java.sql.ResultSet), тоді ви не позбудетесь попереджень про депрекацію лише за допомогою анотації @SuppressWarnings ("депрекація") , якщо ви також не коментуєте той самий новий метод за допомогою @Deprecated примітки. Це логічно, тому що в іншому випадку ви можете "недооцінити" метод, просто змінивши його опис інтерфейсу.


Ця комбінація "@SuppressWarnings" і "@Deprecated" також працює для виклику застарілих методів всередині вашого власного методу.
Swav

1
Я так довго шукав це пояснення. Дякую!
Джабари Даш

2

Ви можете використовувати:

javac FileName.java -Xlint: -визначення

Але тоді це дасть вам попередження, а також повідомить вам частину коду, що викликає депресію або використання застарілого API. Тепер ви можете запустити код із цими попередженнями або внести відповідні зміни в код.

У моєму випадку я використовував, someListItem.addItem("red color")тоді як компілятор хотів мене використовувати someListItem.add("red color");.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.