2016-12-16 189 views
1

我工作在Java OCP考試編譯,我碰到這個問題通配符泛型

考慮下面的代碼來:

Transaction t1 = new Transaction<>(1, 2); //1 
Transaction t2 = new Transaction<>(1, "2"); //2 

它要求// 1必須編譯和//2不能編譯。 Class Transaction的以下哪些聲明將滿足請求?

答案是這樣的一個:

public class Transaction<T, S extends T> { 
    public Transaction(T t, S s) { 

    } 
} 

我理解。但是當我將這段代碼放入一個Eclipse項目時,它可以工作!這裏是我的代碼:

class TransactionD<T, S extends T> { 
    public TransactionD(T t, S s){ 
     System.out.println("D: t: " + t.getClass() + " s: " + s.getClass()); 
    } 
} 
public class Test1 
{ 
    public static void main(String[] args) { 

     TransactionD d1 = new TransactionD<>(1, 2); //1 
     TransactionD d2 = new TransactionD<>(1, "2"); //2 
    } 

} 

我的輸出是這樣的:

d:T:類java.lang.Integer S:類java.lang.Integer

d:T:級Java。 lang.Integer s:class java.lang.String

我的問題是:我錯過了什麼?

+0

什麼是您的書或模擬測試的目標Java版本? 「OCP」似乎是Java5/6-ish。 – Mena

+0

嘗試發送'新的Integer(1),「2」'到'TransactionD'構造函數 – CraigR8806

+0

@Mena它是7或8(我實際上是一名教授,與正在使用7或8的學生一起工作,所以我不是確定這個學生在哪個版本) – Shoikana

回答

5

由於您使用在聲明中原料的類型,你實際上是使用TransactionD<Object, Object>,這使得呼叫有效的,因爲根據Java泛型,Object延伸Object,都IntegerString也繼承對象。

+0

打開所有的編譯器警告就會發現這一點。 – VGR