0

最初のバージョン:

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);
  }
}

2 番目のバージョン、式インターフェイスの更新:

public interface Expression extends DeepCopyable<Expression>
{
}

しかし、今ではコンパイルエラーが発生します

Error: C:\temp\Invocation.java:1: DeepCopyable cannot be inherited with different arguments: <Expression> and <Statement>

戻り値の型が不変である一般的なケースでは、このエラー メッセージを理解できます。ただし、戻り値の型 A と B で同じインターフェイスを 2 回継承し、さらに実装メソッドが C を返す場合、C は A と B に関して共変です。これは安全ではないでしょうか?

4

2 に答える 2

0

異なるパラメーターを使用してインターフェイスを 2 回実装することはできません。これは、2 番目のバージョンの問題です。

最初のバージョンの問題は、両方のインターフェースdeepCopyがわずかに異なる署名で指定されていることです。ただし、実装している署名はどちらとも互換性があるため、問題はありません。

于 2012-12-23T20:56:49.257 に答える
0

Invocation クラスでは、2 つのインターフェイス Expression と Statement を拡張しています。コードの 2 番目のバージョンでは、以下に示すように、Expression インターフェイスが DeepcCopyable インターフェイスを拡張しています。

class Invocation implements Expression, Statement {...}




interface Statement extends DeepCopyable<Statement> {
}

interface Expression extends DeepCopyable<Expression> {
}

あなたのコードでは、異なるジェネリックに拡張されている 2 つのインターフェイス Expression と Statement を実装するときに何が起こりますか?クラス。

于 2012-12-23T08:01:00.570 に答える