2013-03-24 16 views
5

Questo è davvero un problema strano, non ho mai incontrato qualcosa del genere. Quanto segue è una classe di supporto che ho dichiarato all'interno di una classe più grande. Funziona perfettamente così com'è:Errore di mancata corrispondenza di tipo tra java.lang.String e String

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; 
    } 
} 

Tuttavia, facendo confusione ho scoperto un problema di confusione. Sostituendo questa linea:

root.data = rootData; 

con:

root.data = "some string literal"; 

ottengo questo errore:

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

Ho provato alcune assegnazioni letterali stringa in altre classi e sembra funzionare perfettamente bene. Ho recentemente aggiornato a Java 1.7.0_15 e recentemente scaricato e installato Eclipse 4.2. Sospetto che ci possa essere una certa confusione nel percorso di costruzione o qualcosa del genere. utilizzando Ubuntu 12.04

Qualsiasi aiuto sarebbe molto apprezzato! Ho cercato e cercato e non ho trovato nulla di simile a questo problema.

+0

Questo è davvero interessante. Non ho mai incontrato nulla di simile prima. –

risposta

7

Stai creando un nuovo parametro di tipo generico denominato "String", che probabilmente non è quello che desideri.

Change

private static class Tree<String> { 

a

private static class Tree { 
2

Sembra che si stia tentando di creare una classe generica utilizzando "String" come nome del tipo generico. Ciò che i tipi generici fanno è ogni volta che si crea un oggetto dalla classe, esso sostituisce ciò che si trova nel <> con il nuovo tipo.

Quindi nella tua classe, se hai creato un Tree<Integer>, l'istanza di "String" nella tua classe verrà sostituita da "Integer". Questo è il modo in cui alcune classi come ArrayList funzionano per consentire l'utilizzo di qualsiasi tipo.

Di solito quando si utilizzano tipi generici, viene utilizzata una singola lettera, ad esempio "T", per evitare che sia uguale a un tipo di classe reale.

Quindi nel tuo caso, stai tentando di impostare una "stringa" che non sia in realtà una stringa come una stringa effettiva.

0

ho risolto digitando

import java.lang.String;