2014-10-03 13 views
8

corso Java 1.8 JavaSE-1.8 (jdk1.8.0_20)funzione Generics chiamata non la compilazione in Java 8 estendere più interfacce

Questa classe:

public class SimpleQuestion { 

    public static void main(String[] args) { 
     DoNothing(); 
     DoNothing2(); 
     DoNothing3(); 
     DoNothing4(); 
    }  

    public interface Interface1 { 
     public void go(); 
    } 

    public interface Interface2<X> { 
     public X go2(); 
    } 

    private static <X, T extends Interface2<X> & Interface1> void DoNothing() { 
     return; 
    } 

    private static <X, T extends Interface2 & Interface1> void DoNothing2() { 
     return; 
    } 

    private static <X, T extends Interface2<X>> void DoNothing3() { 
     return; 
    } 

    private static <T extends Interface2<T> & Interface1> void DoNothing4() { 
     return; 
    }  

} 

dà l'errore di compilazione:

Il metodo DoNothing() nel tipo SimpleQuestion non è applicabile per gli argomenti()

Wh e quell'uno e non DoNothing2,3 e 4?

+11

Non riesce in Eclipse. Il compilatore Oracle funziona per me. Piango bug! –

+0

Tuttavia, funziona se si forniscono esplicitamente argomenti tipo. –

+0

Compila bene per me in Java7; probabilmente un bug nel compilatore/IDE che stai usando – Krease

risposta

4

Il messaggio di errore sembra riferirsi a un errore dell'algoritmo definito in section 18.5.1 of the spec.

Per DoNothing, l'algoritmo procede come segue (usando la terminologia dal link qui sopra):

  • I parametri di tipo sono

    P1 = X

    P2 = T extends Interface2<X> & Interface1

    e' Io uso a1 e a2 per le variabili di inferenza corrispondenti.

  • Il set iniziale è legata

    B0 = {a1 <: Object, a2 <: Interface2<a1>, a2 <: Interface1}

  • Non ci sono argomenti, quindi non ha limiti aggiuntiva a questo punto (B2 = B0).

  • C'è una dipendenza di a2 su a1, quindi proviamo a risolvere prima a1. Ha un corretto limite superiore dell'oggetto, quindi lo istanziamo a questo. Incorporando a1 = Object comporta l'aggiunta il limite

    a2 <: Interface2<Object>

  • Successivo risolviamo a2. Questo ha ora due limiti superiori corretto, così abbiamo istanziare a2 alla loro GLB:

    a2 = Interface2<Object> & Interface1

  • Ogni variabile ha ora un'istanza, quindi la risoluzione è riuscita.

Quindi, contrariamente al messaggio di errore, l'invocazione di DoNothing dovrebbe essere applicabile. Questo sembra essere un bug nel tuo compilatore Java.

Problemi correlati