使用通配符泛型进行编译

Sho*_*ana 1 java generics bounded-wildcard

我正在进行Java OCP考试,我遇到了这个问题

给出以下代码:

Transaction t1 = new Transaction<>(1, 2); //1
Transaction t2 = new Transaction<>(1, "2"); //2
Run Code Online (Sandbox Code Playgroud)

要求// 1必须编译,// 2必须不编译.类Transaction的以下哪个声明会满足请求?

答案是这样的:

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

   }
}
Run Code Online (Sandbox Code Playgroud)

我明白了 但是,当我将此代码放入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
    }

}
Run Code Online (Sandbox Code Playgroud)

我的输出是这样的:

D:t:class java.lang.Integer s:class java.lang.Integer

D:t:class java.lang.Integer s:class java.lang.String

我的问题是:我错过了什么?

Sea*_*oyd 5

既然你在你的声明中使用的原始类型,你实际上是使用TransactionD<Object, Object>,这使得呼叫有效的,因为根据Java泛型,Object扩展Object,都IntegerString还扩展对象.