泛型(8)-Java7的"菱形"語法與泛型構造器


   正如泛型方法允許在方法簽名中聲明泛型形參一樣,Java也允許在構造器簽名中聲明泛型形參,這樣就產生了所謂的泛型構造器.

package com.j1803;
class Foo{
public <T> Foo(T t){
System.out.println(t);
}
}
public class GenericConstructor {
public static void main(String[] args) {
//泛型構造器中的T類型為String
new Foo("AAAA");
//泛型構造器中T類型為Integer
new Foo(45);

//顯示指定泛型構造器中的T類型為String
//傳給Foo構造器的實參也是String對象,完全正確
new <String>Foo("BBBB");

//顯示指定泛型構造器中的T類型為String
//傳給Foo構造器的實參確實Double對象,編譯錯誤
//new <String>Foo(45.23);//編譯錯誤
}
}
 new <String>Foo("BBBB");不僅顯示指定了泛型構造器中泛型形參T的類型應該是String,而且程序傳給該構造器的參數值也是String類型,因此程序完全正確,而在new <String>Foo(45.23);總則因為類型不同而出現編譯錯誤.
Java7新增的"菱形"語法,它允許調用構造器時在構造器后使用一對尖括號來代表泛型信息,但如果程序顯示地指定了泛型構造器中聲明的泛型形參的實際類型,則不可以使用"菱形"語法.
package com.j1803.Type_wildcards;
class MyClass<E>{

public <T>MyClass(T t){
System.out.println("t的參數是:"+t);
}
}
public class GenericDiamondTest {
public static void main(String[] args) {
//MyClass類聲明中的EString類型
//泛型構造器中聲明的T形參是Integer類型
MyClass<String> mc1=new MyClass<>(5);

//顯示指定泛型構造器中聲明的T形參是Integer類型
MyClass<String> mc2=new <Integer>MyClass<String>(6);

//MyClass類聲明中的EString類型
//如果顯示指定泛型構造器中聲明的T形參是Integer;
//此時就不能使用"菱形"語法,下列代碼是錯的.
//MyClass<String>mc3=new <Integer> MyClass<>(5);
}
}
上面的代碼中即制定了泛型構造器的泛型參數是Integer類型,又想使用"菱形"語法,所以這行代碼無法通過編譯
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM