2016-12-16 2 views
1

Je travaille sur l'examen Java OCP, et je suis tombé sur cette questionavec les génériques génériques Compiler

Vu le code suivant:

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

Il est nécessaire que // 1 doit compiler et// 2 ne doit pas compiler. Laquelle des déclarations suivantes de la transaction Transaction satisfera la demande?

La réponse est celle-ci:

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

    } 
} 

Ce que je comprends. Mais quand je mets ce code dans un projet Eclipse, ça marche! Voici mon code:

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 
    } 

} 

Ma sortie est la suivante:

D: t: Classe java.lang.Integer s: classe java.lang.Integer

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

Ma question est la suivante: qu'est-ce qui me manque?

+0

Quelle est la version de Java que votre livre ou test de simulation vise? "OCP" semble Java5/6-ish. – Mena

+0

essayez d'envoyer 'new Integer (1)," 2 "' à votre constructeur 'TransactionD' – CraigR8806

+0

@Mena c'est 7 ou 8 (je suis en fait un professeur travaillant avec des étudiants qui utilisent soit 7 ou 8, donc je ne suis pas quelle est la version dans laquelle se trouve cet étudiant) – Shoikana

Répondre

5

Depuis que vous utilisez dans votre types premières déclaration, vous utilisez effectivement TransactionD<Object, Object>, ce qui rend l'appel valide, comme selon les génériques java, Object étend Object, et les deux Integer et String étendent également l'objet.

+0

L'activation de tous les avertissements du compilateur l'aurait révélé. – VGR