第一个版本:
public interface DeepCopyable<T>
{
T deepCopy();
}
public interface Statement extends DeepCopyable<Statement>
{
}
public interface Expression
{
Expression deepCopy(); // forgot I have an interface for this
}
public class Invocation implements Expression, Statement
{
public final String Field;
public Invocation(String field)
{
Field = field;
}
public Invocation deepCopy()
{
return new Invocation(Field);
}
}
第二版,更新表达式接口:
public interface Expression extends DeepCopyable<Expression>
{
}
但现在我得到编译错误
Error: C:\temp\Invocation.java:1: DeepCopyable cannot be inherited with different arguments: <Expression> and <Statement>
在返回类型不变的一般情况下,我可以理解此错误消息;但是,如果我两次使用返回类型 A 和 B 继承相同的接口,并且进一步,实现方法返回 C,其中 C 与 A 和 B 是协变的,这不应该是安全的吗?