1

だから、私はJavaで働いておりjava.sql.ResultSet、自分のクラスにキャストしようとしていますMyResultSet

コードは次のとおりです:MyResultSet.java

public class MyResultSet implements java.sql.ResultSet{
     //There are a bunch of Implemented Methods here. None of them have any custom code, They are all unchanged. Just didn't want to put huge code in here.
}

キャストに使用しようとしているコード

ResultSet r = getResultSet();
return (MyResultSet)r;

これを実行するたびに、「ClassCastException」が発生します。

誰かが実装クラスにキャストする方法を教えてもらえますか?..

4

3 に答える 3

5

あなたがやろうとしていることの例:

public interface Animal { } // in your case java.sql.ResultSet

public class Dog implements Animal { } // in your case r

public class Cat implements Animal { } // in your case MyResultSet 

後で

Animal a = getAnimal(); // returns a Dog
Cat c = (Cat) a; // ClassCastException - Can't cast a Dog to a Cat.

Dogaを aにキャストしようとしていますが、 a は aではないCatため、うまくいきません。CatDog

于 2013-02-19T17:39:51.473 に答える
3

はい、getResultSet()を実装するクラスを返しますjava.sql.ResultSetが、これはそれを実装する別のクラスにキャストできるという意味ではありません。それは継承の仕組みではありません。

       ResultSet
       /       \
MyResultSet  What getResultSet returns

特定のタイプのクラスがある場合、継承ツリーで上または下にのみキャストできます。上にキャストしてから別の方向に下にキャストすることはできません。

オプション:

  • getResultSet()が返されるか (つまり、継承の最下位レベルにあるクラス) がわかっている場合は、それをMyResultSet継承することができます。

  • ResultSetメンバーを持ち、そのメンバーで適切なメソッドを呼び出すラッパー クラスを用意します。何かのようなもの:

    class MyResultSet
    {
      private ResultSet resultSet;
      public MyResultSet(ResultSet resultSet1) { resultSet = resultSet1; }
      public doSomething() { resultSet.doSomething(); }
    }
    
于 2013-02-19T17:37:21.877 に答える
3

キャストできません。はのgetResultSet()実装を提供しますがjava.sql.ResultSet、これは明らかにあなたのものではありませんが、Java 実装に属しています。

メソッドを使用する場合は、呼び出しを委任できます。

public class MyResultSet implements ResultSet{
private ResultSet orig;
public MyResultSet(ResultSet orig) {
    this.orig = orig;
}

// do delegations, 1000 methods like this
public String getString(int columnIndex) throws SQLException {
    return orig.getString(columnIndex);
}
// your own methods can come here
}

Eclipse では、委任されたメソッドのコードを生成できます。それらを 1 つずつ記述する必要はありません。プライベート フィールドを作成し、RightClick - Source - Generate Delegate Methods... を実行するだけです。

この手法はラッピングと呼ばれます。元のオブジェクトを自分のオブジェクトにラップして、機能を追加しました。

これで、次のように呼び出すことができます。

ResultSet originalresultset = ...;
MyResultSet myresultset = new MyResultSet(originalresultset);
于 2013-02-19T17:40:44.967 に答える