2016-12-16 108 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