私はこの質問をしばらく尋ねられたように知っていますが、とにかく自分のコードに適用できるものは見つけられません。多分私はすべてを完全に理解していなかったからかもしれない。私はちょうど@SuppressWarnings("unchecked")
解決策を避けたいです。だから私のコードのための新しいアーキテクチャを見つける。ジェネリックとチェックされていないキャスト
私はジェネリック型にキャストしようとしたとき、私は、この行で警告Unchecked cast:com.example.reader.models.SearchableBook to T
を持っている:(T)epubReader.readEpub(fileInputStream)
public class BookHelper {
public static <T> T openBook(String ebookFilePath, boolean searchable) {
T book = null;
EpubReader epubReader = new EpubReader();
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(ebookFilePath);
book = searchable ? (T)new SearchableBook(epubReader.readEpub(fileInputStream)) : (T)epubReader.readEpub(fileInputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return book;
}
}
私はこのBookHelper方法は非常によく似た2を持つ回避帳やSearchableBookを返すことができますしたいので、私はジェネリックを使用メソッド。
私はこのような何かを行うメソッドにパラメータとして型を送信しようとしましたが、私はまだ同じ警告があります。それがすべてで安全ではないではありませんので、私はSuppressWarningsを使用することができますが、私はこの正しい方法をしたいと思っこの最後の場合には
public static <T> T openBook(String ebookFilePath, boolean searchable, Type t) {
T book = null;
EpubReader epubReader = new EpubReader();
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(ebookFilePath);
if(t instanceof Book) {
book = (T)epubReader.readEpub(fileInputStream);
} else ...
:私はまだ確かに、私は同じ問題を抱えているように、ジェネリック型を返すことがあります。この場合、人々が一般的にどのように行動するかを知りたい。このインタフェースを実装
public interface Searchable {
String findSentence(String words);
}
ラッパーのMyBook:私はUpdate 1では、今私は私の検索可能なインタフェースを持っている
...最善の方法は、この警告を避けるために、自分のコードを複製することはないと思います
public class MyBook implements Searchable {
private Book mBook;
public MyBook(Book book) {
this.setBook(book);
}
public Book getBook() {
return mBook;
}
public void setBook(Book book) {
mBook = book;
}
@Override
public String findSentence(String words) {
return null;
}
}
マイopenBook(String ebookFilePath, boolean searchable)
方法:
:
protected void onCreate(Bundle savedInstanceState) {
...
MyBook searchBook = BookHelper.openBook(BOOK0_PATH, true);
Book book = BookHelper.openBook(BOOK1_PATH,false).getBook();
...
}
それは、コードの複製で、動作しますが。私がブックをインスタンス化したいのであれば、ラッパーをインスタンス化し、getterを呼び出すgetBook()
。しかし、を導入するために使用された資源には、私はBook
のために必要ではないがどうなるのだろうか?検索可能な書籍(MyBookラッパー)に固有の検索機能=>findSentence()
の実装で使用されるリソースについて説明しています。それらは私のOpenBook
メソッドでのみ使用され、GCはそれらをクリアしますか? 。実際、私はそれが以前考えられなかった理由を理解できないほど単純です。
しかし、インターフェイスの目標は何ですか?なぜなら、MyBookクラスにはいくつかのメソッドがあり、誰も必須ではないので、インターフェイスを配置する必要はないからです。私は明確だと思う。
したがって、私のジェネリック型はBookから継承されます。これはどうやって動くのだろう? TがBookを拡張する場合、SearchableBookをTにキャストできません。 – Laurent
私は 'SearchableBook'が' Book'を拡張すると思っています...もしそうでなければ、ジェネリックタイプの代わりにインターフェースを使うことをお勧めします。 – beeb
'public static T openBook(String ebookFilePath、boolean searchable)'と 'SearchableBook'を使うと' Book'が拡張されます。 –
Laurent