3

Java クラスを拡張する Scala クラスを作成しています。この抽象 Java クラスにはいくつかのコンバーターが含まれているため、拡張する必要があります。また、フレームワークにプラグインできる独自のコンバーターを作成する必要があります。したがって、以下のメソッドの署名は私に強制されます。クラスが抽象クラスを拡張すると言うと、Eclipse によって自動的に生成されます。メソッドのシグネチャを変更しようとすると、「親からの抽象メソッドを実装していない」ため、クラスはコンパイルに失敗します。

もちろん、メソッドの実装は私の選択ですが、型システムの制約を満たすことができないことがわかりました。

私は非常に単純なことをする必要があります: "None" を null として扱い、それ以外はそのまま返します。しかし、タイプセーフな方法ではこれを行うことができないことがわかりました。以下のようなコードを書くと、「抽象型 T は消去により消去されるため未チェックです」という警告が出ます。どうすればそれをなくすことができますか?

また、消去が適用された場合、コードがどのように見えるか、つまり、2 番目の "if" 条件がどのようになるかについても考えています。

直感的に、入力が Any の場合に T を返すことを保証できないことを理解しています。これが、コンパイラが不満である理由です。実際には、文字列を読み取って文字列を返すだけなので、これは機能しますが、メソッドのシグネチャは継承宣言によって強制されます。

  def execute[T](value: Any): T = {
    if (value == null || value == "None") null.asInstanceOf[T]
    // Warning: abstract type T is unchecked since it is eliminated by erasure
    else if (value.isInstanceOf[T]) value.asInstanceOf[T]
    //            warning here: ^
    else null.asInstanceOf[T]
  }

このメソッドを実装するにはどうすればよいですか?

4

2 に答える 2

1

最終的に、次の 2 つのいずれかを行うことができます。

  1. Java で実装:

    @SuppressWarnings("unchecked") @Override public T execute(Object value) { if (value == null || "None".equals(String.valueOf(value))) return null; それ以外の場合は (T) 値を返します。}

  2. Scala で実装し、@unchecked を追加

    def execute[T](value: Any): T = { if (value == null || value == "None") null.asInstanceOf[T] else if (value.isInstanceOf[T @unchecked]) value.asInstanceOf [T] そうでなければ null.asInstanceOf[T] }

消去後の2番目のifステートメントには何が残っているのだろうか。

提案してくれたアレックに感謝します!

于 2016-08-05T22:01:20.817 に答える