Rzućmy tej klasy strukturę:Generics problem: clone() próbuje przypisać słabsze uprawnienia dostępu
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);
}
}
mam ten błąd kompilacji (chociaż IDE, Intellij w moim przypadku, nie jest w stanie pokazać błąd podczas kodowanie)
Error:(4, 37) java: clone() in java.lang.Object cannot implement clone() in foo.TypeCloneable attempting to assign weaker access privileges; was public
wiem, że kompilator próbuje wywołać metodę z Object
clone()
zamiast TypeCloneable
, ale nie rozumiem dlaczego. Próbowałem również casting do TypeCloneable
(I suposed kompilator byłoby wiedzieć, które wywołanie metody clone()
w tym przypadku, ale ten sam problem).
public void foo(T element) throws Exception {
TypeCloneable typeCloneable = (TypeCloneable) element;
TypeCloneable cloned = (TypeCloneable) typeCloneable.clone();
}
Jestem nieco zdezorientowany ... Czy mogę coś tutaj zrobić, aby zmusić klonowanie klonów() z TypeCloneable?
Dzięki za HELLP
Jeśli Rozumiem JLS poprawnie, należy skompilować . Myślę, że to błąd. http://stackoverflow.com/questions/33023332/why-doesnt-this-java-program-compile –
Tak, tak ... to wygląda na błąd. Nie znalazłem tego pytania. Dzięki! – troig