2015-10-20 8 views
5

Diamo questa struttura di classe:Generics problema: clone() il tentativo di assegnare più deboli i privilegi di accesso

public interface TypeIdentifiable {} 

public interface TypeCloneable extends Cloneable { 
    public Object clone() throws CloneNotSupportedException; 
} 

public class Foo implements TypeCloneable, TypeIdentifiable { 

    @Override 
    public Object clone() throws CloneNotSupportedException { 
     // ... 
     return null; 
    } 
} 

public abstract class AbstractClass<T extends TypeCloneable & TypeIdentifiable> { 

    public void foo(T element) throws Exception { 
     TypeCloneable cloned = (TypeCloneable) element.clone(); 
     System.out.println(cloned); 
    } 
} 

ho questo errore di compilazione (anche se l'IDE, Intellij nel mio caso, non è in grado di dimostrare l'errore, mentre codifica)

Error:(4, 37) java: clone() in java.lang.Object cannot implement clone() in foo.TypeCloneable attempting to assign weaker access privileges; was public 

so che il compilatore sta cercando di chiamare clone() metodo dal Object invece di TypeCloneable, ma io non capisco perché. Ho anche provato a lanciare a TypeCloneable (ho supposto che il compilatore sapesse quale chiamata al metodo clone() in questo caso, ma lo stesso problema).

public void foo(T element) throws Exception { 
     TypeCloneable typeCloneable = (TypeCloneable) element; 
     TypeCloneable cloned = (TypeCloneable) typeCloneable.clone(); 
    } 

io sono un po 'confuso ... Posso fare qualcosa qui per forzare callling clone() da TypeCloneable?

Grazie per la HELLP

+1

Se ho capito bene il JLS, questo dovrebbe compilare . Penso che sia un bug. http://stackoverflow.com/questions/33023332/why-doesnt-this-java-program-compile –

+1

Quindi sì ... sembra un bug. Non ho trovato questa domanda. Grazie! – troig

risposta

2

Questo funziona per me, (sto indovinando si tratta di un problema con il tipo & Type sintassi limite superiore):

interface TypeIdentifiable {} 

interface TypeCloneable extends Cloneable { 
    public Object clone() throws CloneNotSupportedException; 
} 

class Foo implements TypeCloneable, TypeIdentifiable { 

    @Override 
    public Object clone() throws CloneNotSupportedException { 
     // ... 
     return null; 
    } 
} 

interface TypeCloneableAndIndetifiable extends TypeCloneable, TypeIdentifiable { 

} 
abstract class AbstractClass<T extends TypeCloneableAndIndetifiable> { 

    public void foo(T element) throws Exception { 
     TypeCloneable cloned = (TypeCloneable) element.clone(); 
     System.out.println(cloned); 
    } 
} 
+0

Grazie per aver risposto @WillShackleford. Sì, se avvolgo entrambe le interfacce in una, come dici tu, funziona. Il problema è che sia TypeCloneable che TypeIdentifiable sono codice legacy. Pensi che questo potrebbe essere un bug con la sintassi upperbound di & Type? – troig

+0

Non ne sono sicuro. Avrei pensato che avrebbe funzionato come lo hai usato prima di vedere questa domanda. – WillShackleford

+0

Come @Paul Boddington indica un commento, sembra un bug. Forse potresti modificare la tua risposta aggiungendo questo. Ad ogni modo, accetto il tuo suggerimento per il tuo suggerimento su come avvolgere due interfacce in una sola. Grazie – troig

Problemi correlati