1

ジェネリックスを使用してStrategy + Factoryパターンを実装しようとしています。目標は、クライアントのクラスにDocumentDaoを扱うことができるインタフェースDocumentDaoの実装を返すことです。ドキュメントの異なるサブタイプに対してDocumentDaoを拡張する複数のDaoインタフェースがあります。ここでJava - ファクトリとジェネリックのストラテジパターン

は私のコードです:

public class Document { ... } 

public class DocumentA extends Document { ... } 

public class DocumentB extends Document { ... } 

public interface DocumentDao<T extends Document> { 
    public void update(T document); 
} 

public interface DocumentADao<DocumentA> {} 

public interface DocumentDaoFactory { 
    public <T extends Document> DocumentDao<T> getDaoInstance(Class<T> clazz); 
} 

その後、私は工場を使用しよう:

private <T extends Document> void someMethod(T document) { 
    ... 
    DocumentDao<T> documentDao = this.documentDaoFactory.getDaoInstance(document.getClass()); 
    documentDao.update(document); 
    ... 
} 

しかしgetDaoInstance()呼び出しに関するコンパイラの不満:どのように

Type mismatch: cannot convert from DocumentDao<? extends AbstractGDriveDocument<?>> to DocumentDao<T> 

この状況に対処するには? 同様のソリューションを入手するにはどうすればよいですか?

おかげ

答えて

4

問題はgetClassがAPIに適してClass<?>を返すということです。特定のClassインスタンスが戻ってくるものはわかりません。さらに、型バインドが不正であり、メソッドで無効です。

この問題を解決するには、次の2つの事を変更する必要があります:

  • をごDocumentDaoFactory方法では、適切なものにバインドを変更します。 getDaoInstanceのご利用には

    <T extends Document> DocumentDao<T> getDaoInstance(Class<T> clazz); 
    
  • Class<T>に未チェックのキャストを行います。

    DocumentDao<T> documentDao = this.documentDaoFactory.getDaoInstance((Class<T>) document.getClass()); 
    

あなたのタイプがバインドされている方法は、任意のランタイムエラーを得ることなく、あなたが気にインスタンスをあなたに戻って与える必要があります。

+0

最初のエラーで申し訳ありませんが、それはちょうど私の実際のコードではそれが正しいことを見落としたので、私は質問を更新します。 第2のポイントは私の問題を解決しました。ありがとうございました。 – user1781028