1)爲什麼obj4,obj6,obj7給編譯錯誤,並且obj5很好?我在哪裏可以閱讀有關規則,調整使用這種通用耦合外層內部類?我沒有發現任何直接的問題。管理實例化泛型外部類及其內部通用內部類的實例並聲明相應引用的規則是什麼?
當我沒有在obj3中爲Inner類提供任何類型參數時,它是好的(而Inner類需要給它的類型爲S的fld3字段的東西),但是當我這樣做並且不提供類外部類 - 它不會編譯(obj4) - 雖然對象可能暗示...
2)此外,爲什麼obj10編譯好,但obj11失敗?在obj10行我也寫outerInstance.new內部<>(),暗示內部S是對象。但是,這是不是內部問題,但同樣的「貓膩」是外部問題...
//in Class A of package com.sth
public class MyGen<T> {
T fld1;
class GenInner<S> {
T fld2;
S fld3;
}
// within main of Class Driver of same package com.sth
MyGen.GenInner obj1 = new MyGen<String>().new GenInner<Integer>();
MyGen.GenInner obj2 = new MyGen<String>().new GenInner<>();
MyGen.GenInner obj3 = new MyGen<String>().new GenInner();
//MyGen.GenInner obj4 = new MyGen().new GenInner<String>(); //ERR !
MyGen.GenInner obj5 = new MyGen<>().new GenInner<String>();
//MyGen<String>.GenInner obj6; // ERR
//MyGen.GenInner<String> obj7; // ERR
MyGen<String>.GenInner<Integer> obj8;
MyGen.GenInner obj9;
MyGen<String>.GenInner<Integer> obj10 = new MyGen<String>().new GenInner<>();
//Type mismatch: cannot convert from MyGen<Object>.GenInner<Integer> to MyGen<String>.GenInner<Integer>
//MyGen<String>.GenInner<Integer> obj11 = new MyGen<>().new GenInner<Integer>(); // ERR!
這些答案涉及到我的問題,但沒有提供任何線索:
Java 8也拒絕'obj3':「形式不正確,某些參數丟失」。 –
奇怪,但我的Eclipse編譯器爲Java SE8編譯obj3行很好,並且在運行時沒有問題! P.S .: MyGen.GenInner obj3 = new MyGen().new GenInner(); –
LrnBoy
我想我應該更具體一些:OpenJDK 8的編譯器拒絕分配給'obj3'的類實例化表達式。 OpenJDK也是Oracle品牌JDK的基礎,因此它具有很大的優勢。我不認爲拒絕它是正確的,@ Radiodef的優秀答案儘管如此,但我認爲這樣寫代碼是不明智的。除少數例外,新代碼不應該使用原始類型(也不要嘗試使用稀有類型)。 –