【问题标题】:Suppress java compiler warnings caused by parent class in packaged library抑制打包库中父类引起的java编译器警告
【发布时间】:2019-08-13 10:05:12
【问题描述】:

我正在扩展打包库中的类,而我正在扩展的类会导致“未经检查”的编译器警告。请注意,导致警告的不是我的班级,这就是为什么这与我在 SO 中找到的其他问题不同。

为了符合我公司的代码标准,我的代码必须在没有警告的情况下编译,但我无法摆脱这个。

最初,我什至没有覆盖有问题的方法。我重写它只是为了添加 @SuppressWarnings("unchecked") 注释,但这并没有解决问题。

在库中,一个抽象类 ClassA 有这个方法:

public abstract class ClassA {

    protected abstract <T> T methodA(
        String lockName, 
        TransactionCallback<T> txCallback);
}

同样在库中,另一个类 ClassB 扩展了 ClassA 导致警告:

public class ClassB extends ClassA {

    @Override
    protected Object methodA(
            String lockName, 
            TransactionCallback txCallback) {
        return someOtherMethod(lockName, txCallback, null);
    }

}

这使用了未经检查的操作,所以当我尝试编译我的类时:

public class ClassC extends ClassB {

  @SuppressWarnings("unchecked")
  @Override
  protected Object methodA(String lockName, @SuppressWarnings("rawtypes") TransactionCallback txCallback) {
    return super.methodA(lockName, txCallback);
  }

}

我收到此警告:

    [javac]   protected Object methodA(String lockName, @SuppressWarnings("rawtypes") TransactionCallback txCallback)
    [javac]                    ^
    [javac]   return type requires unchecked conversion from Object to T
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in method <T>methodA(String,TransactionCallback<T>)

即使我不能重新编译有问题的类但只能重新编译它的后代,是否有办法实际抑制警告?

【问题讨论】:

  • @Michael 消息来自自己编译的代码。
  • 我没有重新编译 jar 中的类,只有我的类,它扩展了库中的类。这对我来说也很奇怪,但我敢肯定,因为类路径中没有违规类(或完整库)的源代码。事实上,如果我删除我的课程,警告根本不会出现。
  • @user207421,感谢您的提示,但我已经尝试过了。如果我这样做,则该类不会编译,因为它并没有真正“覆盖”该方法。从技术上讲,在某些情况下,您可以在 ClassB 中的方法域之外调用我的方法。
  • @Michael,我知道我会,我并不是说它编译每个库的每个类。但并非所有库中的所有类都被您实际编译的代码扩展。如果我删除我的课程,我不会收到警告。如果我从我的类中删除该方法但继续在库中扩展该类,我会收到警告。
  • @Michael,感谢您的回答,解决了问题。我不同意您对我的陈述错误的看法。确实,我的班级的存在使警告“出现”,但不是我的班级在进行不安全/未经检查的操作。无论如何,我非常感谢您抽出宝贵的时间来重现和解决问题。

标签: java compiler-warnings


【解决方案1】:

我设法复制了。无论出于何种原因,班级级别的@SuppressWarnings 似乎都有效。

@SuppressWarnings("unchecked")
public class ClassC extends ClassB
{
    protected Object methodA(String lockName, TransactionCallback txCallback) {
        return super.methodA(lockName, txCallback);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2016-10-02
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多