所以,我正在使用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”。
有人可以向我解释如何投射到已实施的类吗?..
答案 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);