2012-05-09 6 views
2

Essential Java Genericsこのコードの出力と述べている:コンパイラが挿入したメソッド(型消去による)はvolatileですか?

public interface Foo<T> { 
    void foo(T param); 
} 

public class Bar implements Foo<Bar> { 
    // This method will appear twice once with Object as parameter and once with Bar. 
    public void foo(Bar param) { 
    } 

    public static void main(String[] args) { 
     for (Method m : Bar.class.getMethods()) 
      if (m.getName().startsWith("foo")) 
       System.out.println(m.toGenericString()); 
    } 
} 

は次のとおりです。

public void Bar.foo(Bar) 
public volatile void Bar.foo(java.lang.Object) 

しかし、私は(1.7コンパイラ)をコンパイルしたコードを実行したときに、私が持っている:

public void Bar.foo(Bar) 
public void Bar.foo(java.lang.Object) 

1.6コンパイラを使って再コンパイルしました。しかし、私の出力はまだ同じです。

著者の正確な引用は次のとおりです。

$ java Bar 
public void Bar.foo(Bar) 
public volatile void Bar.foo(java.lang.Object) 

だから、彼の部分に誤植のように見えるしていません。

出力が異なる原因は何ですか?

答えて

7

Javaには揮発性メソッドはありません。フィールドのみがvolatileです。

詳細はWhy make a method volatile in java?を参照してください。

先頭の答えとして、同じビットマスク(0x00000040)は、フィールドとメソッドで異なる目的で使用されています。これは古いJavaツールを混乱させ、bridge methodsvolatileと誤ってマークすることになります。

つまり、ブログ作成者がその時点で使用していたソフトウェアにバグがあり、ソフトウェアに誤ってvolatileが含まれていました。 The bug got fixedと表示され、誤った修飾語句が表示されなくなりました。

+0

あなたはそのblogpostの作家が間違いをしたと言っていますか? – Pacerier

+0

@Pacerier:私が言っていることは、この文脈では、「揮発性」は赤いニシンであるということです。 – NPE

+0

私があなたを理解していることを確認するために、作者が出力が 'public volatile void Bar.foo(java.lang.Object)'であったことはないので、作者が誤植をしていると言っていますか? – Pacerier

関連する問題