1

首先,我知道有人已经发布了这个问题,但不幸的是,他们的解决方案无法解决我的问题。

让我解释一下,我有一个 Book 类 (Libro) 和一个扩展抽象类 (LibroConcreto) 的具体类。另外,我有一个目录类,其特征是一个书籍容器(T 型)。我应该做的是将一本书分配给容器,并在其他方法中返回按标题或按年份(这是书籍类的属性)排序的本书容器的副本,具体取决于用户的选择。为此,我使用了一个 TreeSet 和两个实现 Comparator 类的类。

但是,在将 Book 分配给目录的属性列表时的 main 中,在运行时抛出了以下异常:

Exception in thread "main" java.lang.ClassCastException: class trac1settembre2019.libro.LibroConcreto cannot be cast to class java.lang.Comparable (trac1settembre2019.libro.LibroConcreto is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
    at java.base / java.util.TreeMap.compare (TreeMap.java:1291)
    at java.base / java.util.TreeMap.put (TreeMap.java:536)
    at java.base / java.util.TreeSet.add (TreeSet.java:255)
    at trac1september2019.catalogue.Catalogue.addbook (Catalog.java:28)
    at trac1settembre2019.test.TestProgramma.main (TestProgramma.java:42)

下面是我的代码:

package traccia1settembre2019.catalogo;
    
import java.util.Comparator;
    
import traccia1settembre2019.libro.Libro;
    
public class LibriByAnno implements Comparator <Libro>{
    public int compare (Libro obj1, Libro obj2) {
        return obj1.getAnnoPubblicazione()-obj2.getAnnoPubblicazione();
    }
}
package traccia1settembre2019.catalogo;

import java.util.Comparator;
import traccia1settembre2019.libro.Libro;
    
public class LibriByTitolo implements Comparator <Libro>{
    public int compare (Libro obj1, Libro obj2) {
        return obj1.getTitolo().compareToIgnoreCase(obj2.getTitolo());
    }
}
package traccia1settembre2019.test;
    
import traccia1settembre2019.catalogo.Catalogo;
import traccia1settembre2019.libro.*;
import java.util.Scanner;
import java.util.Set;
    
public class TestProgramma {
    
    public static void main(String[] args) {
        int numeroLibri;
        Catalogo<LibroConcreto> c1=new Catalogo ();
        int maxNumLibri=Catalogo.getMaxLibri();
        LibroConcreto l;        
        Scanner in=new Scanner (System.in);
        String stringa;
        int anno;
        int numeroCopie;
        int maxCopie=Libro.getMaxCopie();
        
        do {
            System.out.println ("Quanti libri vuoi inserire?");
            numeroLibri=in.nextInt();
        } while (numeroLibri>maxNumLibri);
        
        stringa=in.nextLine();
            
        for (int i=0; i<numeroLibri; i++) {
            System.out.println ("Inserire il titolo: ");
            stringa=in.nextLine();
            System.out.println ("Inserire l'anno di pubblicazione");
            anno=in.nextInt();
            
            do {
                System.out.println ("Inserire il numero di copie disponibili, deve essere un numero minore di "+maxCopie);
                numeroCopie=in.nextInt();
            } while (numeroCopie>maxCopie);
            
            l=new LibroConcreto (stringa, anno, numeroCopie);
            
            c1.aggiungiLibro(l);
        }
        
        Set <LibroConcreto> c1OrdinatoByAnno=c1.leggiLibriByAnno();
        
        for (Libro l2: c1OrdinatoByAnno) {
            System.out.println (l2);
        }
        
        Set <LibroConcreto> c1OrdinatoByTitolo=c1.leggiLibriByAnno();
        
        for (Libro l3: c1OrdinatoByTitolo) {
            System.out.println (l3);
        }
    }   
}
package traccia1settembre2019.catalogo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import traccia1settembre2019.libro.Libro;

public class Catalogo <T extends Libro>{
    private Set <T > libri;
    private int codice;
    private int numLibri;
    private static int numeroCataloghi;
    private static final int MAX_LIBRI=300;

    public Catalogo () {
        libri=new TreeSet <> ();
        numeroCataloghi++;
        codice=numeroCataloghi;
        numLibri=0;
    }
    
    public boolean aggiungiLibro (T obj) {
        if (numLibri<MAX_LIBRI) {
            libri.add(obj);
            numLibri++;
            return true;
        }
        return false;
    }
    
    public Set<T> leggiLibriByAnno () {
        Set <T> copia=new TreeSet <>(new LibriByAnno());
        copia.addAll(libri);
        return copia;
    }
    
    public Set<T> leggiLibriByTitolo () {
        Set <T> copia=new TreeSet <>(new LibriByTitolo());
        copia.addAll(libri);
        return copia;
    }
    
    public int numLibriCatalogabili () {
        return MAX_LIBRI-numLibri;
    }
    
    public String libroAntico () {
        List <Libro> lista=new ArrayList <> ();
        lista.addAll(libri);
        Libro l=Collections.min (lista, new LibriByAnno());
        return l.getTitolo();
    }
    
    public void eliminazioneLibri () {
         this.libri.clear();
    }
    
    public int hashCode () {
        final int prime=31;
        int result=1;
        result=prime*result+codice;
        return result;
    }
    
    public boolean equals (Object obj) {
        if (obj==this)
            return true;
        if (obj==null) 
            return false;
        if (getClass()!=obj.getClass())
            return false;
        Catalogo <T> other=(Catalogo<T>)obj;
        if (other.getCodice()==codice)
            return false;
        return true;
    }

    public int getCodice() {
        return codice;
    }
    
    public String toString () {
        return "Catalogo: [codice="+codice+", numero di libri:"+numLibri+", libri="+libri+"]";
    }

    public static int getMaxLibri() {
        return MAX_LIBRI;
    }
}
package traccia1settembre2019.libro;

public abstract class Libro {
    private String titolo;
    private int annoPubblicazione;
    private int numCopieDisponibili;
    private static final int MAX_COPIE_DISPONIBILI=5;
    
    public Libro (String titolo, int anno, int numCopie) {
        this.titolo=titolo;
        this.annoPubblicazione=anno;
        this.numCopieDisponibili=numCopie;
    }

    public String getTitolo() {
        return titolo;
    }
    
    public int getAnnoPubblicazione() {
        return annoPubblicazione;
    }
    
    public int getNumCopieDisponibili() {
        return numCopieDisponibili;
    }
    
    public String toString () {
        return "Libro: [ titolo="+titolo+", anno di pubblicazione="+annoPubblicazione+", numero di copie disponibili="+numCopieDisponibili;
    }
    
    public static int getMaxCopie () {
        return MAX_COPIE_DISPONIBILI;
    }
    
}
package traccia1settembre2019.libro;
    
public class LibroConcreto extends Libro {
    
    public LibroConcreto(String titolo, int anno, int numCopie) {
        super(titolo, anno, numCopie);
    }
    
    public String toString () {
        return super.toString()+"]";
    }
    
}
4

0 回答 0