Java Genericity with'?'

时间:2016-12-10 08:40:47

标签: java generics

我尝试打开并读取具有通用性的文件,但是我无法将搜索结果存储到我的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();
        }
    }
}

2 个答案:

答案 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