我尝试打开并读取具有通用性的文件,但是我无法将搜索结果存储到我的arrayList中,因为我无法使用'?&#创建临时对象39;类型。 错误出现在这里"对象temp =(对象)entree.readObject(); liste.add(温度);"
private void open(ArrayList<?> liste){
JFileChooser choixFichier = new JFileChooser();
int resultat=choixFichier.showOpenDialog(null);
if(resultat==JFileChooser.CANCEL_OPTION)
{
JOptionPane.showMessageDialog(null, "création du fichier annulée");
return;
}
File nomFichier=choixFichier.getSelectedFile();
if(nomFichier==null || nomFichier.getName().equals(""))
{
JOptionPane.showMessageDialog(null,"nom du fichier incorrect");
}
ObjectInputStream entree = null;
try{
entree = new ObjectInputStream(new FileInputStream(nomFichier));
while(true){
Object temp=(Object)entree.readObject();
liste.add(temp);
}
}
catch(java.io.EOFException e){
JOptionPane.showMessageDialog(null, "Fin de de la lecture");
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
entree.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
答案 0 :(得分:-1)
现在我们知道了一点。如果您需要特定类型:
#include <graphics.h>
这将是&#34; temp&#34;对象匹配&#34; liste&#34;的通用边界的类型。如果给它一个Integer列表,它将转换为Integer。但是,由于&#34; reification&#34;,这在运行时没有得到很好的执行,因此是一个警告。
如果您想要更强大的运行时检查:
private <E> void open(ArrayList<E> liste) {
...
liste.add((E)temp); // Compiler will warn, but this is the way
...
}
或者如果你只需要ArrayList:
private <E> void open(ArrayList<? super E> liste, Class<E> clazz) {
...
liste.add(clazz.cast(temp)); // No compiler warnings and runtime enforcment
...
}
答案 1 :(得分:-1)
您无法将ArrayList<?>
添加到ArrayList<?>
的原因是因为ArrayList<String>
是包含特定未知类型对象的列表。请注意,它与我所说的&#34;任何类型的对象&#34; 不完全相同。这意味着可能例如是Object
。而且您无法将String
添加到liste.add(temp)
列表中。这就是@SuppressWarnings("unchecked")
private <T> void open(ArrayList<T> liste) {
...
liste.add((T) temp);
无效的原因。
如果要指定读取的对象类型,则需要在方法签名中指定类型:
event