我想编写一个从二进制文件中读取对象的方法,但我想用泛型来概括它。
我有这段代码:
@SuppressWarnings ("unchecked")
public static <T> T readFromBinaryFile (String filename){
T obj = null;
if (FileUtils.existsFile (filename)){
ObjectInputStream ois = null;
try{
ois = new ObjectInputStream (new FileInputStream (filename));
obj = (T)ois.readObject ();
}catch (IOException e){
Debug.out (e);
}catch (ClassNotFoundException e){
Debug.out (e);
}finally{
try{
if (ois != null) ois.close();
}catch (IOException e){
Debug.out (e);
}
}
}
return obj;
}
当我执行它时,我得到一个ClassCastException。我对Java中的模板一无所知,因此任何信息都会被贬值。我已经阅读了与擦除,编译时和执行时相关的内容,但我不太清楚为什么会得到这个ClassCastException。
感谢。
编辑:我这样称呼方法:
FileUtils.readFromBinaryFile (filename);
(没有“”)
答案 0 :(得分:2)
Java中是否有模板?只使用Object代替T.在Java中,一切都来自基础的Object,所以你不需要T obj而是Object obj。
答案 1 :(得分:2)
ClassCastException意味着您读取的类型与您期望的类型不匹配(并转换为)我建议您查看在调试器(或日志消息)中读取的对象,并将其与您期望的内容进行比较。
答案 2 :(得分:1)
你的方法错了。 就这样做:
FileUtils.readFromBinaryFile (filename);
您所谓的通用方法就是所谓的通用方法。
“我们不必将实际类型参数传递给泛型方法。编译器根据实际参数的类型推断出我们的类型参数。它通常会推断出最具体的类型参数这将使通话类型更正。“ source
编辑:
我已经尝试了你的例子并且它有效(我实际上已经评论了一些行)
private static String filename = "number.serialized";
public static void main(String[] args) {
Double d = 3.14;
writeToBinary(d, filename);
Double readD = readFromBinaryFile(filename);
System.out.println(readD);
}
@SuppressWarnings ("unchecked")
public static <T> T readFromBinaryFile(String filename) {
T obj = null;
File file = new File(filename);
if (file.exists()) {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(filename));
obj = (T)ois.readObject();
} catch (IOException e) {
} catch (ClassNotFoundException e) {
} finally {
try {
if (ois != null)
ois.close();
} catch (IOException e) {
}
}
}
return obj;
}
public static <T> void writeToBinary(T obj, String filename)
{
try {
FileOutputStream fis = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(fis);
oos.writeObject(obj);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}