2016-12-16 3 views
1

Я работаю на экзамене Java OCP, и я наткнулся на этот вопросКомпиляция с подстановочных дженериков

Учитывая следующий код:

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

Это требуется, что // 1 необходимо собрать и// 2 НЕ должны компилироваться. Какое из следующих объявлений класса 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: т: класс java.lang.Integer s: класс java.lang.Integer

D: т: класс Java. lang.Integer s: class java.lang.String

Мой вопрос: что мне не хватает?

+0

Что такое Java-версия, на которую нацелена ваша книга или макет теста? «OCP» кажется Java5/6-ish. – Mena

+0

попробуйте отправить 'new Integer (1)," 2 "' на ваш конструктор 'TransactionD' – CraigR8806

+0

@Mena это 7 или 8 (я на самом деле профессор, работающий со студентами, которые используют 7 или 8, поэтому я не уверенный, в какой версии находится этот ученик) – Shoikana

ответ

5

Поскольку вы используете сырые типы в вашем объявлении, вы на самом деле с помощью TransactionD<Object, Object>, и это делает вызов действительным, так как в соответствии с ява дженериков, Object расширяет Object, и оба Integer и String также расширить объект.

+0

Включение всех предупреждений компилятора могло бы показать это. – VGR

Смежные вопросы