Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    illegal generic type for instanceof

    Arieccomi con un nuovo test.

    codice:
    import java.util.*; 
    
    public class TestSheet {
         public static void main(String[] args) {
         Spreadsheet spreadsheet = new SimpleSpreadsheet();
         List<WorkSheet> list = spreadsheet;
         // this should be respected
         assert (list.get(0) instanceof Map<Coordinates,Object>);
         assert spreadsheet.size() == 1;
         spreadsheet.get(0).put(new Coordinates("A1"), new Integer(5));
    }
    Dovrei creare delle classi che validano questo test.
    Ho creato dunque:
    codice:
    public class SimpleSpreadsheet extends Spreadsheet{    
        public SimpleSpreadsheet(){
            super();
        }
    }
    
    public class Spreadsheet extends ArrayList<WorkSheet>{
        public Spreadsheet(){
            this.add(new WorkSheet("A0", 0));        
        }
    }
    
    public class WorkSheet<K,V> extends HashMap<K,V>{
        public WorkSheet(){
                super(0);
        }
    }
    
    public class Coordinates{ 
        String coord;
        public Coordinates(String coord){
            this.coord = coord;
        }
    }
    compilando mi da un errore
    codice:
    illegal generic type for instanceof
    sulla riga
    codice:
    assert (list.get(0) instanceof Map<Coordinates,Object>);
    Qualche consiglio?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da AnthraXite Visualizza il messaggio
    compilando mi da un errore
    codice:
    illegal generic type for instanceof
    sulla riga
    codice:
    assert (list.get(0) instanceof Map<Coordinates,Object>);
    I generics "esistono" solo a livello di compilazione. A runtime non è possibile determinare e distinguere se es. un oggetto lista è un List<String> o un List<Integer> o altra parametrizzazione.
    Pertanto nel tipo a destra di instanceof è proibito usare un tipo parametrizzato. L'unica parametrizzazione tecnicamente possibile è con il "wildcard" ( ? ) perché per scelta di chi ha inventato i generics in Java, un tipo parametrizzato solo con wildcard è "reificato".

    Quindi togli la parametrizzazione o metti tutti wildcard:

    list.get(0) instanceof Map

    o

    list.get(0) instanceof Map<?,?>
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    P.S. se mi dici di nuovo che il test non lo puoi cambiare (lo capisco), allora le cose sono due: chi ti ha dato il TestSheet, a) vuole "fregarti" per vedere come rispondi, b) non ha capito una mazza sui generics.

    E se è a) semplicemente rispondi che il test è inapplicabile perché scorretto e non compilabile.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    Hai perfettamente ragione, quella riga di codice nel test era commentata e c'era la correzione sotto:
    codice:
    // this should be respected
    //assert (list.get(0) instanceof Map<Coordinates,Object>);
    assert (list.get(0) instanceof Map);
    io le ho invertite pensando che l'avesse commentata il collega che mi ha passato il test non riuscendo a risolverlo ma probabilmente è stato il professore stesso.

    Correggendo con assert (list.get(0) instanceof Map) però il compilatore mi consiglia di compilare con -Xlint:deprecation per "unchecked or unsafe operations". E questo è il risultato:
    codice:
     warning: [deprecation] Integer(int) in Integer has been deprecated
    spreadsheet.get(0).put(new Coordinates("A1"), new Integer(5));

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da AnthraXite Visualizza il messaggio
    Hai perfettamente ragione, quella riga di codice nel test era commentata e c'era la correzione sotto
    Ok

    Quote Originariamente inviata da AnthraXite Visualizza il messaggio
    il compilatore mi consiglia di compilare con -Xlint:deprecation per "unchecked or unsafe operations". E questo è il risultato:
    codice:
     warning: [deprecation] Integer(int) in Integer has been deprecated
    spreadsheet.get(0).put(new Coordinates("A1"), new Integer(5));
    spreadsheet.get(0) dà come tipo un WorkSheet. Ma WorkSheet è una classe "generica" perché è dichiarata class WorkSheet<K,V>

    E' generica ma poi in

    class Spreadsheet extends ArrayList<WorkSheet>

    l'uso di WorkSheet non è parametrizzato. Dato che WorkSheet è-un HashMap, anch'esso non è parametrizzato.

    Quindi il put(new Coordinates("A1"), new Integer(5)) lo sta facendo su un raw-type, il HashMap "crudo" e non parametrizzato.


    E invece in this.add(new WorkSheet("A0", 0)); c'è un piccolo errore. WorkSheet non ha (non si vede dal codice iniziale) un costruttore per quei 2 argomenti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    Ok grazie. Provo a correggere.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.