ClassCastException

0
      import java.util.*;
      import java.io.*;
      public class Main
      {
          public static class NewString implements Comparable
          {
              String pole;
              public NewString(String s)
              {
                  pole=s;
              }
              public int compareTo(Object str)
              {
                  String s=(String)str;
                  if(pole.length()==s.length()) return pole.compareTo(s);
                  else if(pole.length()>s.length()) return 1;
                       else return -1;
              }
              public String toString()
              {
                  return pole;
              }
          }
          public static void main(String[] args)throws IOException
          {
       
              StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
              PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)),true);
              TreeSet<NewString> set=new TreeSet<NewString>();
              out.println("Liczba prob: ");
              st.nextToken();
              for(int i=0;i<(int)st.nval;i++)
              {
                  out.println("Podaj wyraz: ");
                  st.nextToken();
                  set.add(new NewString(st.sval));
              }
              for(NewString s: set)
              {
                  out.println(s);
              }
          }
      }
  Powyższy kod wyrzuca wujątek ClassCastException przy próbie wprowadzania danych, lecz zupełnie nie wiem dlaczego mimo przeczytania opisu tego wyjątku. Czy moglibyście mi to trochę wyjaśnić? Będę bardzo wdzięczny. (Kod ma za zadanie sortowanie Stringów według długości).
1

Generalnie metoda compareTo służy do porównywania obiektów tych samych typów. Gdybyś używał genericsów i napisał:

public static class NewString implements Comparable<NewString>

To nie było wtedy takich problemów.

ClassCastException to wyjątek przy błędzie rzutowania - tutaj (czyli w "String s=(String)str;") rzutujesz Object, który w rzeczywistości jest NewStringiem na typ String, co jest oczywistym błędem.

0

dzięki wielkie, poprawiłem to i działa, tak jak chciałem :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1