Typ elementu "ściąganego" z LinkedList

0

Witam,
mam problem ze "ściąganiem" elementów z LinkedList<String>. Otóż po użyciu .removeFirst() / .removeLast() chciałbym przypisać wartość tego elementu do pola typu String, jednak za każdym razem dostaję komunikat:

For input string: "jakisstring"

albo

java.lang.Integer cannot be cast to java.lang.String

I nie wiem jak sobie z tym poradzić... ani rzutowanie na (String) nie pomaga, ani użycie .toString(), ciągle te same błędy. jak sobie z tym poradzić?

pozdrawiam

0

Kod albo it didn't happened.

0

Najważniejszy fragment:

String item = "";
LinkedList<String> wyrazenie;     // tutaj wyrazenie ma juz jakies wartosci, tj. po wyświetleniu System.out.print(wyrazenie) dostajemy: [1, +, b, +, 2]
item = wyrazenie.removeFirst();

to chyba najważniejszy fragment. jak już mówiłem próby rzutowania typu
item = (String) wyrazenie.removeFirst();
nie pomogły. i nie wiem co robię źle...

0

Zmyślasz

LinkedList<String> wyrazenie;     // tutaj wyrazenie nie ma żadnych wartości, jest nullem
item = wyrazenie.removeFirst();  // tutaj dostajesz NPE (o ile w ogóle skompilujesz)
0

Oj... popatrz wyżej na fragment:
LinkedList<String> wyrazenie; // tutaj wyrazenie ma juz jakies wartosci, tj. po wyświetleniu System.out.print(wyrazenie) dostajemy: [1, +, b, +, 2]
zmienna "wyrazenie" jest przyjmowana przez metodę i ma na pewno wartość, wspominam o tym w komentarzu (nie jest nullem na 100%).
i większy fragment kodu uznałem za zbędny ale proszę:

public static LinkedList<String> JakasMetoda( LinkedList<String> wyrazenie ) throws Exception {
   // kod
  String item = "";
   // jak wyzej, tutaj wyrazenie ma juz jakies wartosci, tj. po wyświetleniu System.out.print(wyrazenie) dostajemy: [1, +, b, +, 2]
   item = wyrazenie.removeFirst();  
}

kompilować kompiluje się bez problemu ale podczas wykonania pojawiają się błędy (patrz posty wyżej).

0

Nie cytuj wybranych kawałków, daj cały kod. Takiego kodu nie skompilujesz

    private static LinkedList<String> metoda(LinkedList<String> wyrażenie)
    {
        LinkedList<String> wyrażenie;
        System.out.println(wyrażenie);
    }
0

A może po prostu wpychasz do tej listy coś innego niż stringi? Bo przecież generici w javie mają type erasure i można tam wpychać co się chce...

0

Skompiluj kod z -Xlint:unchecked i pokaż logi z kompilacji. Napisz też czy używasz @SuppressWarnings("unchecked")

Tak jak napisał @Shalom, być może rzutujesz na LinkedList<String> coś co niekoniecznie zawiera same Stringi.

0

Bo tego kodu więcej nie ma... tylko tyle:
(jak mówiłem argument metody JakasMetoda to właśnie wyrazenie w podanym typie, zawiera w sobie np. [2, +, 10, -, x], a ja chcę ściągać po elemencie z "wyrazenie" i przypisać ów element do zmiennej String, czyli stosując item = wyrazenie.removeFirst() chciałbym do zmiennej item przypisać 2)

public static LinkedList<String> JakasMetoda( LinkedList<String> wyrazenie ) throws Exception {
		Strig item = "";
	try {
		item = wyrazenie.removeFirst();
	} catch (Exception e) {
		throw new Exception(e + ": wyrzucony wyjatek, nieudane przypisanie do zmiennej");
	}
}

i jak wspomniałem wyrzucany jest wyjątek.

EDIT: no tam są zarówno elementy liczbowe, znakowe itp. dlatego chciałem robić rzutowanie...

0
bogdans napisał(a):

Kod albo it didn't happened.

it didn't happen?

0

Java to nie php czy inny basic, rzutowanie liczby na string nie zmienia liczby na string, tylko powoduje wyjatek...

0

Zamiast:

List<String> lista = new LinkedList<String>();

Zrób:

List<String> lista = Collections.checkedList(new LinkedList<String>(), String.class);

Zobaczysz w którym miejscu pchasz do listy coś czego nie powinieneś tam wepchać.

Jak chcesz mieć Stringa z Integera to użyj String.valueOf albo Integer.toString

0

Rzutowanie nie zadziała, ale metoda toString() tak.

0
Wibowit napisał(a):

Skompiluj kod z -Xlint:unchecked i pokaż logi z kompilacji. Napisz też czy używasz @SuppressWarnings("unchecked")

Tak jak napisał @Shalom, być może rzutujesz na LinkedList<String> coś co niekoniecznie zawiera same Stringi.

Nie używam @SuppressWarnings("unchecked").
Po skompilowaniu z tą opcją dostałem 10 warningów (w Eclipse są one podkreślone na żółto) typu:

where E is a type-variable:
E extends Object declared in class LinkedList
.\Sprawdz.java warning: [unchecked] unchecked call to add(E) as a member of the raw type LinkedList
...
required: LinkedList<String>
found: LinkedList
10 warnings

Wszystkie warningi takie same (tylko numery wierszy się zmieniają) ale wszystkie tyczą się klasy "Sprawdz", a moja metoda o którą pytam jest w innej klasie.

I wiem, że Java to nie PHP ale jak w takim razie zrobić, by móc coś innego typu przypisać do zmiennej String (bo np. dalsze działania na zmiennej można dokonać tylko jeśli ma typ String) ?

@bogdans - ponownie, czytaj uważniej proszę (pierwszy post):
I nie wiem jak sobie z tym poradzić... ani rzutowanie na (String) nie pomaga, ani użycie .toString(), ciągle te same błędy. jak sobie z tym poradzić?

0

Może po prostu potrzebujesz List<Integer> skoro elementami listy są liczby,

0
String s = cokolwiek.toString();

Działa na pewno. Robisz inny błąd.

1

Ale klasa Sprawdz pewnie wypełnia tą listę i wpycha do niej coś co nie jest Stringiem.

@bogdans:
Rzutowanie jest już przy wyciąganiu, a nie dopiero przy przypisywaniu. Dlatego ten kod wyrzuci ClassCastException:

import java.util.LinkedList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List lista = new LinkedList();
        lista.add(5);
        List<String> listaGeneryczna = lista;
        System.out.println(listaGeneryczna.get(0).toString());
    }
}

Przy kompilacji z -Xlint:unchecked dostaję takie komunikaty:

/home/piotrek/NetBeansProjects/IdeoneJava/src/Main.java:11: warning: [unchecked] unchecked call to add(E) as a member of the raw type List
        lista.add(5);
  where E is a type-variable:
    E extends Object declared in interface List
/home/piotrek/NetBeansProjects/IdeoneJava/src/Main.java:12: warning: [unchecked] unchecked conversion
        List<String> listaGeneryczna = lista;
  required: List<String>
  found:    List

Dla przykładu ten kod:

class H<A> {
    public A a;
}

class C1<A extends Number> {
    void metoda(H<A> a) {
        System.out.println(a.a.intValue());
    }
}

class C2<A extends Double> {
    void metoda(C1<A> c1, H<A> a) {
        c1.metoda(a);
    }
}


public class Main {

    public static void main(String[] args) {
        H h = new H();
        h.a = "lol";
        H<Double> hd = h;
        new C2<Double>().metoda(new C1<Double>(), hd);
    }
}

Wykłada się na rzutowaniu do Number, a nie do Double.

0

Jakbyś @mati21 dał cały kod od razu byłoby prościej znaleźć przyczynę błędu. Poniższy kod działa.

import java.util.LinkedList;
import java.util.List;
 
public class A
{ 
    public static void main(String[] args) 
    {
        List lista = new LinkedList();
        lista.add(5);
        List<String> listaGeneryczna = lista;
        System.out.println(lista.get(0).toString());
        //System.out.println(listaGeneryczna.get(0).toString());
    }
}
0

@Wibowit, istotnie, znalazłem już błąd.
w klasie Sprawdz, tak jak mówi warning, pakowałem "surowe" elementy typu List zamiast List<String> i to było ok, ale w kolejnej klasie to się wysypywało właśnie.

Dzięki wszystkim za pomoc i wskazówki, pozdro!

1

Jak chcesz mieć listę obiektów różnych typów to zrób List<Object> a po wyciągnięciu ręcznie sprawdzaj typ jeśli nie masz pewności jaki on jest. Metoda get() na List<Object> generalnie zawsze powinna się powieść.

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