【发布时间】:2017-01-17 11:34:47
【问题描述】:
我知道这个问题被问了很多时间,但无论如何我找不到可以应用于我的代码的东西。也许是因为我没有完全理解一切。我只是想避免@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 方法可以返回 Book 或 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 但我想以正确的方式这样做......我想知道人们在这种情况下通常是如何做的。我想最好的方法是不要复制我的代码来避免这个警告......
更新 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 类中有几个方法,没有一个是强制性的,所以不需要放入接口。希望我很清楚。
【问题讨论】:
标签: android generics casting warnings