泛型中有個問號什么意思呢,代表某種確定的類型,但是又有不確定性。怎么講呢,這個世界其實每件事情都是這樣的。比如有個接口Ia,實現類有Aone,Atwo,但是呢,在運行的時候有可能是Aone或者Atwo,是哪一個呢,不知道,這是不確定性;但是都是Ia接口的類型,這又是確定性。所以要創建一個泛型類來表示這種情況呢,就可以寫作:
public interface Ia { void Say(); } public class Aone implements Ia { @Override public void Say() { System.out.println("this is " +this.getClass()); } } public class Atwo implements Ia { @Override public void Say() { System.out.println("this is" + this.getClass()); } public static void main(String[] args){ Class<? extends Ia> aAClass=Aone.class;//此處如果換做其他非Ia類就會報錯的 try { Ia aA=aAClass.newInstance(); aA.Say(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
有人說,我這直接用Class不就可以了嗎,為啥要用問號呢,的確用Class也可以,但是,用了問號就可以在編譯時確定你要的類型的范圍,避免在運行時才知道類型不對。
加了問號后,既有了靈活性又有了確定性,就是有變有不變,該變的變,該不變的不變,這就是所謂的"持經達變",我們老祖宗的中庸之道,就是如此,可以看出軟件領域也符合這個道理。