0

DMSServiceLocator.class というサービス ロケーター クラスがあり、その中に getParser() というメソッドがあり、戻り値の型は Parser です。パーサーを拡張する Impl を使用して AutoMateParser というサービスを返そうとしていますが、パーサーが必要であるというコンパイル エラーが発生し、AutoMateParser が見つかりました。サービス インターフェイスではなく new AutoMateServiceImpl() を返すと、コンパイル エラーは発生しません。私の getParser() メソッドは、 autoMateParser が同じタイプであることを認識していないようです。「return (Parser) autoMateParser;」と AutoMateParser を Parser でキャストしてみました。コンパイル エラーは解決されましたが、キャスト例外が発生しました。誰かがこれを行う方法を知っているかどうか疑問に思っています。前もって感謝します。

以下は私のコードのサンプルです。

AppModule.class

public static void bind(ServiceBinder binder) {
        binder.bind(AutoMateParser.class, AutoMateParserImpl.class);
}

DMSServiceLocator.class

public class DMSServiceLocator {

    @Inject
    private AutoMateParser autoMateParser;

    public Parser getParser() {
        if(automate) {
        return autoMateParser();
        } else {
           //Different data scrubber, but also extends Parser
           return homenetParser();
        }
    }

}

AutoMateParserImpl.class

public class AutoMateParserImpl extends Parser implements AutoMateParser {
    protected Vehicle parseCar(String vehicleData) {
        //some data scrubbing code
    }
}

パーサークラス

public abstract class Parser {
    //some csv line reader code
    protected abstract Vehicle parseCar(String carData);
}
4

1 に答える 1

1

タイプ のオブジェクトを返そうとしていますAutoMateParser。そのインターフェイスはサブタイプではないParser(のみAutoMateParserImplである)ため、コンパイラは文句を言います。クラス階層を再考する必要があります。

メソッドをParser使用してインターフェイスを抽出し、そのインターフェイスを拡張し、インターフェイスを実装する抽象クラスを作成し、サービス ロケーターが抽象実装ではなくインターフェイス タイプを返すようにすることができます。parseCarAutoMateParserParserImplParserParser

編集:タイプは次のようになります。

public interface Parser {
   //public methods that you need to call
}

public interface AutoMateParser extends Parser {
    //any extra or overriden method declarations
}

public abstract class AbstractParser implements Parser {
    //common code and implemented methods
    protected abstract Vehicle parseCar(String carData);
}

public class AutoMateParserImpl extends AbstractParser implements AutoMateParser {
    //any extra or overriden method implementations defined in AutoMateParser
    protected Vehicle parseCar(String vehicleData) {
        ...
    }
}

public class DMSServiceLocator {

    @Inject
    private AutoMateParser autoMateParser;
    //more services

    public Parser getParser() {
        if(automate) {
           return autoMateParser();
        } else {
           //Different data scrubber, but also extends Parser
           return homenetParser();
        }
    }

}
于 2012-08-21T07:04:17.917 に答える