Я знаю этот вопрос, как было задано столько времени, но в любом случае я не могу найти то, что могу применить к моему коду. Может быть, потому, что я не полностью понял все. Я просто хочу избежать решения @SuppressWarnings("unchecked")
. Итак, найдите новую архитектуру для моего кода.Generics and unchecked cast
У меня есть предупреждение 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 может возвращать книги или SearchableBook избежать того, два очень похожих методы.
Я попытался отправить тип в качестве параметра методу, выполняя что-то подобное, но у меня все еще есть такое же предупреждение. Я до сих пор вернуть универсальный тип, так точно у меня такая же проблема:
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 ...
В этом последнем случае это не небезопасные вообще, так что я мог бы использовать SuppressWarnings, но я хотел бы сделать это правильный путь. .. и я хотел бы знать, как люди обычно делают в этом случае. Я думаю, лучший способ не повторить мой код, чтобы избежать этого предупреждения ...
Update 1
Теперь у меня есть свой интерфейс с возможностью поиска:
public interface Searchable {
String findSentence(String words);
}
обертка MyBook, который реализует этот интерфейс:
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)
метод:
public static MyBook openBook(String ebookFilePath, boolean searchable) {
MyBook book = null;
EpubReader epubReader = new EpubReader();
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(ebookFilePath);
book = new MyBook(epubReader.readEpub(fileInputStream));
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return book;
}
В MainActivity:
protected void onCreate(Bundle savedInstanceState) {
...
MyBook searchBook = BookHelper.openBook(BOOK0_PATH, true);
Book book = BookHelper.openBook(BOOK1_PATH,false).getBook();
...
}
Он работает, без репликации коды, но. Если я хочу создать экземпляр книги, я просто создаю оболочку и вызываю getter getBook()
. Но что случилось с ресурсами, используемыми для создания MyBook
, которые мне не нужны для Book
? Я говорю о ресурсе, используемом при реализации возможностей поиска =>findSentence()
, которые относятся к поисковой книге (оболочка MyBook). Используются ли они только в моем методе OpenBook
, и GC очистит их после? , На самом деле это выглядит так просто, что я не понимаю, почему я не думал об этом раньше ...
но тогда, какова цель интерфейса? потому что явно мне это действительно не нужно, поскольку в классе MyBook будет несколько методов, и никто не является обязательным, поэтому не нужно вводить интерфейс. Надеюсь, я понятен.
Так что мой общий тип унаследует книгу. Как это должно работать? Я не могу использовать SearchableBook для T, если T расширяет книгу. – Laurent
Ну, я думал, что 'SearchableBook' расширяет' Книгу' ... Если бы я не рекомендовал использовать интерфейс вместо родового типа. – beeb
Итак, если я использую 'public static T openBook (String ebookFilePath, boolean searchable)' и 'SearchableBook' расширяет« Книгу », которая должна работать? –
Laurent