2016-07-04 20 views
0

javacで発生した場合に、欠落しているserialversionUID警告をエラーにエスカレートし、ビルドに失敗したい。JavacでVarargs警告を無視する

私は私のAntタスクに以下を追加しました:私は

<compilerarg value="-Xlint:-varargs"/> 
    <compilerarg value="-Xlint:serial"/> 
    <compilerarg value="-Werror"/> 
にjavacタスクを変更しようとした

non-varargs call of varargs method with inexact argument type for last parameter; 
cast to java.lang.Object for a varargs call 
cast to java.lang.Object[] for a non-varargs call and to suppress this warning 

<compilerarg value="-Xlint:serial"/> 
    <compilerarg value="-Werror"/> 

ただし、ビルドも可変引数の警告で失敗します

しかし、それは違いはありませんでした。コンパイラでこれらの警告を無視し、serialversionUIDでのみ失敗するようにするにはどうすればよいですか?私はAntの1.9.4とjavac 1.6u37、1.7u79と試みたと1.8u92を使用しています

Exampleクラスは:

package com.stackoverflow.compiler; 

import java.io.Serializable; 

public class Main implements Serializable { 

    public static void foo(Object... args) { 
     System.out.println("Test foo"); 
    } 

    public static void main(String[] args) { 
     // is args supposed to be an array of objects 
     // or the only element in an array? 
     foo(args); 
    } 
} 

答えて

1

私は質問が約javacであることを知っていますが、私はまだecjがあなたの要件を満たすように設定できることを言及しておきます:単にコマンドラインで-err:serialと言う。

そのオプションを使用すると、このソースファイル

public class Serial implements java.io.Serializable {} 

---------- 
1. ERROR in /tmp/Serial.java (at line 1) 
     public class Serial implements java.io.Serializable {} 
        ^^^^^^ 
The serializable class Serial does not declare a static final serialVersionUID field of type long 
---------- 
1 problem (1 error) 

その他の警告はそのオプションの影響を受けません。このコンパイラの出力をトリガします。特に、-warn:-varargsCastを追加することによって、varargs警告を抑制することができます。警告があなたのビルドに失敗することは決してないので、これは必要ではありません。あなたが本当にしても警告としてこれを表示したくない場合でも、完全なコマンドラインは次のようになります。

ecj -err:serial -warn:-varargsCast Main.java 

は、自動でECJを使用するためのJDT FAQは、税込ビルドを参照してください。蟻。

+0

これで問題は解決しません。また、メソッドfoo(Object ...)の最後の引数のType String []は、varargパラメータの型と正確に一致しません。Object []へキャストして、varargs以外の呼び出しを確認するか、型の個々の引数を渡しますvarargs呼び出しのオブジェクト。 " – opticyclic

+0

@opticyclic重要なのは、 'ecj'を使うと、さまざまな診断を警告やエラーに個別に微調整することができるという点です。表示される診断は、デフォルトで警告として分類されます。私はその警告を完全に抑制する方法をカバーするために答えを更新します。 –

+0

あなたは正しいです。私は同じクラスに2つの例があるので、出力を混乱させました。 – opticyclic

2

あなたが持っている警告が-Xlint:varargsに関連していないようです

javac reference -Xlintための可変引数のオプションによればオプション

public class ArrayBuilder { 
    public static <T> void addToList (List<T> listArg, T... elements) { 
    for (T x : elements) { 
     listArg.add(x); 
    } 
    } 
} 

生成する必要があります:

は、可変引数(可変引数)メソッド、特にの危険な使い方について警告を出し、非reifiable引数

ドキュメントが含まれているものは、次のコードでは、と言っています警告:

warning: [varargs] Possible heap pollution from parameterized vararg type T

私が得る実際の警告(使用してJ avac 1.8.0_65)です:

warning: [unchecked] Possible heap pollution from parameterized vararg type T

(すなわち未確認代わりのを可変引数)

あなたは、このようなコードが原因で発生することができました警告:

public static void foo(Object... args) {...} 

public static void main(String[] args) { 
    // is args supposed to be an array of objects 
    // or the only element in an array? 
    foo(args); 
} 

その警告は、-Xlint:noneオプションを使用してのみ消え去ったが、-Xlint:serialは何もしない。だからあなたが望むものは不可能だと思われます。

関連する問題