【问题标题】:Cast to Implemented Class强制转换为实现类
【发布时间】:2013-02-27 06:51:29
【问题描述】:

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

有人可以向我解释如何转换为已实现的类吗?..

【问题讨论】:

  • getResultSet()的返回类型是什么?
  • 那么getResultSet() 是什么?
  • 可能是java.sql.ResultSet
  • 它是java.sql.ResultSet。这只是示例代码。
  • 看来你必须阅读一些关于类和继承的理论 =) 你不能将任何类强制转换为你在 java 中的实现。

标签: java class classcastexception


【解决方案1】:

你正在尝试做的一个例子:

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

【讨论】:

  • @Dukeling:我的 +1 也让你提出了解决方案。
  • 感谢您的解释,这很有帮助。我现在知道如何使用委托,这应该可以解决我的问题。感谢@GaborSch
【解决方案2】:

你不能施放。 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...

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

现在你可以打电话了:

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

【讨论】:

    【解决方案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(); }
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      相关资源
      最近更新 更多