查阅1.5的src,里面肯定是没有将这两个Modifiers用于修饰Method其次这两个方法是
public PrintStream append(CharSequence csq) throws IOException 和
public PrintStream append(char c) throws IOException
因此并没有冲突
程序没有运行过,关于为什么会出现上面的现象,不知道大家有没有注意到,这两个关键字出现的地方Method都是有返回值的,而且所返回的对象类型都是在@since 1.5或者在1.5里面有实质改动的,所以......
public PrintStream append(CharSequence csq) throws IOException 和
public PrintStream append(char c) throws IOException
因此并没有冲突
程序没有运行过,关于为什么会出现上面的现象,不知道大家有没有注意到,这两个关键字出现的地方Method都是有返回值的,而且所返回的对象类型都是在@since 1.5或者在1.5里面有实质改动的,所以......
这个是上次有人问extends PrintStream用1.5编译不通过时,发现的。PrintStream implements Appendable,但是无论看src还是api都没有发现Appendable接口中的返回类型为Appendable的方法,所以就猜想有问题。结果让我发现了这个1.5里面的新特性,implemention可以以接口中定义的返回类型的子类型来作为返回类型,如下例C:\Program Files\Java\j2sdk1.5.0\bin>type D:\j2sdk1.4.1_01\Test.java
public class Test implements A {
public Test a() {
return this;
}
}interface A {
A a();
}
C:\Program Files\Java\j2sdk1.5.0\bin>javac -verbose D:\j2sdk1.4.1_01\Test.java
[D:\j2sdk1.4.1_01\Test.java を構文解析開始]
[110ms で構文解析完了]
[ソースファイルの検索パス: [D:\j2sdk1.4.1_01\myproject\classes]]
[クラスファイルの検索パス: [C:\Program Files\Java\j2sdk1.5.0\jre\lib\rt.jar, C:\Program Files\Java\j
2sdk1.5.0\jre\lib\jsse.jar, C:\Program Files\Java\j2sdk1.5.0\jre\lib\jce.jar, C:\Program Files\Javaj2sdk1.5.0\jre\lib\charsets.jar, C:\Program Files\Java\j2sdk1.5.0\jre\lib\ext\dnsns.jar, C:\Program
Files\Java\j2sdk1.5.0\jre\lib\ext\localedata.jar, C:\Program Files\Java\j2sdk1.5.0\jre\lib\ext\sunjc
e_provider.jar, C:\Program Files\Java\j2sdk1.5.0\jre\lib\ext\sunpkcs11.jar, D:\j2sdk1.4.1_01\myproje
ct\classes]]
[C:\Program Files\Java\j2sdk1.5.0\jre\lib\rt.jar(java/lang/Object.class) を読み込み中]
[Test を確認中]
[D:\j2sdk1.4.1_01\Test.class を書き込み完了]
[A を確認中]
[D:\j2sdk1.4.1_01\A.class を書き込み完了]
[合計 731ms]C:\Program Files\Java\j2sdk1.5.0\bin>
有道理。这个特性倒是还可以。不过,class实现该特性的方法实在不敢恭维。
因为在class里为了实现那个接口会多出个同名同参数的方法,
(用volatile标记)这已经跟以前版本不兼容了,许多用到reflect
的程序可能都要加以改动。我也是因为以前写的好好的程序出了问题
才发现这个所问题的。这个特性更多的是给我带来麻烦。至于把transient用在方法定义上,我猜可能是用于Class对象序列化的
兼容上的,一个对象本身的Class在序列化时是只传递Class名字和它的
接口定义的摘要。标记volatile和transient的可能做就不计算在内了。