2013-03-24 25 views
5

To naprawdę dziwny problem, nigdy nie spotkałem czegoś podobnego. Poniżej znajduje się klasa pomocnicza, którą zadeklarowałem w większej klasie. Działa perfekcyjnie dobrze, tak jak:Błąd niezgodności typu między java.lang.String a ciągiem

private static class Tree<String> { 
    private Node<String> root; 

    public Tree(String rootData) { 
     root = new Node<String>(); 
     root.data = rootData; 
     root.children = new ArrayList<Node<String>>(); 
    } 

    private static class Node<String> { 
     String data; 
     Node<String> parent; 
     ArrayList<Node<String>> children; 
    } 
} 

Jednak, rozmywając się, odkryłem kłopotliwy problem. Zastępując ten wiersz:

root.data = rootData; 

z:

root.data = "some string literal"; 

otrzymuję ten błąd:

Type mismatch: cannot convert from java.lang.String to String 

testowałem niektóre ciąg dosłowne zadania w innych klasach i wydaje się doskonale pracować w porządku. Niedawno zaktualizowałem do wersji 1.7.0_15 Java, a ostatnio pobrałem i zainstalowałem Eclipse 4.2. Podejrzewam, że na ścieżce budowania może być jakieś zamieszanie czy coś takiego. Używanie Ubuntu 12.04

Każda pomoc będzie bardzo ceniona! Szukałem i szukałem i nie mogłem znaleźć niczego blisko tego problemu.

+0

To jest naprawdę ciekawe. Nigdy wcześniej nie spotkałem się z czymś podobnym. –

Odpowiedz

7

Tworzysz nowy rodzajowy parametr o nazwie "Ciąg", który prawdopodobnie nie jest tym, czego potrzebujesz.

Zmień

private static class Tree<String> { 

do

private static class Tree { 
2

Wygląda na to, że próbujesz utworzyć ogólną klasę, używając "String" jako nazwy swojego ogólnego typu. Typy generyczne to, kiedy tworzony jest obiekt z klasy, zastępuje to, co jest w <> nowym typem.

Tak więc w klasie, jeśli utworzyłeś Tree<Integer>, kiedykolwiek wystąpienie "String" w twojej klasie zostanie zastąpione przez "Integer". W ten sposób niektóre klasy, takie jak ArrayList, pozwalają na użycie dowolnego typu.

Zwykle w przypadku używania typów ogólnych stosowana jest pojedyncza litera, na przykład "T", aby uniknąć tego samego typu, co w prawdziwym typie klasy.

Tak więc w twoim przypadku próbujesz ustawić "String", który nie jest tak naprawdę String jako rzeczywisty ciąg.

0

Rozwiązałem go wpisując

import java.lang.String;