1

所以,我在 Java 中工作,试图将 ajava.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.

您正在尝试将 a 强制转换Dog为 a Cat,但这不起作用,因为 aCat不是 a Dog

于 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 中,您可以生成委托方法的代码,不必一一编写。只需创建私有字段,然后执行RightClick - Source - Generate Delegate Methods...

这种技术称为wrapping。您将原始对象包装到您的对象中,添加了额外的功能。

现在您可以致电:

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