转换为已实现的类

时间:2013-02-19 17:29:43

标签: java class classcastexception

所以,我正在使用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”。

有人可以向我解释如何投射到已实施的类吗?..

3 个答案:

答案 0 :(得分: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.

您正在尝试将Dog投射到Cat,但这不起作用,因为Cat不是Dog

答案 1 :(得分: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(); }
    }
    

答案 2 :(得分: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 - 生成委托方法...

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

现在你可以致电:

ResultSet originalresultset = ...;
MyResultSet myresultset = new MyResultSet(originalresultset);