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
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 –
Quindi sì ... sembra un bug. Non ho trovato questa domanda. Grazie! – troig