2013-02-19 4 views
1

Итак, я работаю в Java, Пытаясь бросить java.sql.ResultSet к моему собственному классу MyResultSetCast к Реализован класс

Вот код: 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. 
} 

Код I» м пытаются использовать, чтобы бросить его

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

Всякий раз, когда я запускаю это, я получаю «ClassCastException».

Может кто-нибудь объяснить мне, как бросить на Реализован класс? ..

+0

Что возвращаемый тип 'getResultSet()'? –

+0

Что ж, 'getResultSet()'? –

+0

Вероятно, 'java.sql.ResultSet' – jlordo

ответ

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 - Источник - Создание методов делегата ...

Эта техника называется оберточной. Вы завернули оригинальный объект в свой, добавив дополнительные функции.

Теперь вы можете позвонить:

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

Спасибо :). Это прекрасно работает –

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(); } 
    } 
    
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.

+0

+1 Ваше объяснение намного более практично, чем мое. – Dukeling

+1

@ Dukeling: У вас есть мой +1, также предлагающий решение. – jlordo

+2

Спасибо за объяснение, Это очень помогает. Теперь я знаю, как использовать делегирование, и это должно решить мою проблему. Спасибо @GaborSch –

Смежные вопросы