2016-09-06 25 views
0

私はjava.sqlパッケージからConnectionインターフェイスを実装するXという名前のクラスを持っています.Java 1.6を使用しています。すべてがうまくいきます.OracleはConnectionインターフェイスJava 1.7でJREを1.7に設定してコードをビルドすると、コードがコンパイルされず、次のエラーが発生する私のコードはエラーでコンパイルされますが、実行時に正常に実行されます

BrmPcmConnection型は継承した抽象メソッドConnection.abort(Executor)を実装する必要があります

私はConnection.abortがJava 7で導入された新しいメソッドであり、実装する必要があることを理解しています。私は1.6を使ってコンパイルされた同じコードを持っていて、1.7 JREで正常に動作します!

なぜコードはエラーでコンパイルされるのですか?実行時には例外がありません。実行時には誰も新しいメソッドを呼び出さないためですか?

+0

古いバージョンを実行している可能性があります。プロジェクトファイルをクリーンアップし、再コンパイルします。 –

+0

エラーの原因となるコードを表示することはできますか?抽象基本クラスと実装を見せてください。 – byxor

答えて

2

アプリケーションをコンパイルするときには、すべての抽象クラスのスーパークラスを実装する必要があります。しかし、あなたはコンパイルされたプログラムを持っていて、何が起こるかをメソッドを追加してスーパークラスやインタフェースを変更するとします。

JVMはプログラムを実行しようとしますが、実際にそのメソッドを呼び出さない限り、これはすべて問題ありません。あなたがそれを持っていないバージョンでコンパイルした場合には難しいメソッドを呼び出すと、ランタイムエラーが発生します。

しかし、持っていないメソッドを呼び出さないでください。すべてのメソッドが呼び出されます。

あなたは、私はこのケースではあなた可能性もthrow new SQLException("Not implemented")

// @Override 
public void setSchema(String pSchema) throws SQLException { 
    throw new UnsupportedOperationException(); 
} 

を追加することをお勧めこれらのメソッドの実装を持っていない場合。

注:私は@Overrideをコメントアウトしていますので、まだ古いバージョンでコンパイルしています。

+1

これは私が考えたことがない面白い動作ですが、完全に意味があります。これは、ユーザーの実装を破ることなく公開されたインターフェイスを更新できることを意味します。ユーザーが再コンパイルする必要がある場合は、問題が発生します。良い答えと私に教えてくれてありがとう。 – byxor

+1

@BrandonIbbotson Java 8では、問題の少ない「デフォルト」の実装でメソッドを追加できます。 –

+0

ありがとうございます。私のクラスは純粋なクラスで抽象ではありません。これらのコンパイルエラーを取り除くには、インターフェイスに新しいメソッドのデフォルト実装を追加するだけでいいですか?setSchemaが新しいメソッドである場合、私はちょうど広告 –

関連する問題