[英]Generics issue: clone() attempting to assign weaker access privileges
Let's have this class structure: 让我们有这个类结构:
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);
}
}
I have this compilation error (although the IDE, Intellij in my case, is unable to show the error while coding) 我有这个编译错误(虽然我的情况下IDE,Intellij,编码时无法显示错误)
Error:(4, 37) java: clone() in java.lang.Object cannot implement clone() in foo.TypeCloneable attempting to assign weaker access privileges; was public
I know that the compiler is trying to call clone()
method from Object
instead of TypeCloneable
, but I don't understand why. 我知道编译器试图从
Object
而不是TypeCloneable
调用clone()
方法,但我不明白为什么。 I also tried it casting to TypeCloneable
(I suposed the compiler would know which clone()
method call in this case, but the same problem). 我也尝试过将其转换为
TypeCloneable
(我认为编译器会知道在这种情况下调用哪个clone()
方法,但同样的问题)。
public void foo(T element) throws Exception {
TypeCloneable typeCloneable = (TypeCloneable) element;
TypeCloneable cloned = (TypeCloneable) typeCloneable.clone();
}
I'm a bit confused...Can I do something here to force callling clone() from TypeCloneable? 我有点困惑......我可以在这里做些什么来强制从TypeCloneable调用clone()吗?
Thanks for the hellp 谢谢你的帮助
This works for me, (I am guessing it is a problem with the Type & Type upperbound syntax): 这适用于我,(我猜测它是Type&Type上限语法的问题):
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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.