2011-10-28 18 views
8

L'output del seguente codice è 123 perché substring prende da beginIndex EndIndex - 1. Tuttavia, sono sorpreso di come char qui è intesa come 3 (int) perché substring prendere due int . Qual è il concetto alla base di questo?Passando char in un metodo con un parametro int

String x = "12345"; 
char a = 3; 
x = x.substring(0, a); 
System.out.println(x); 

risposta

12

Questo vale per tutto il tragitto verso C, dove char è in sostanza un tipo intero stretto e viene implicitamente convertito int quando necessario.

In Java, questo è tecnicamente noto come "conversione primitiva allargata" ed è coperto in section 5.1.2 of the JLS.

+0

+1 ..Si riduce a non pensare a un 'char' come a una lettera o carattere, ma piuttosto come un pezzo di dati che il computer è in grado di mappare a una lettera o un carattere. Quindi, per facilitare questo processo, abbiamo creato alcune scorciatoie per permetterci di assegnare direttamente lettere o caratteri a 'char's (come' char c = 'x'; 'significa semplicemente" Un pezzo di dati rappresentato dalla variabile c è il valore che si associa al carattere 'x'. "La variabile 'c' non è più una lettera di qualsiasi altra parte di dati nel sistema.) – corsiKa

0

la dichiarazione delle funzioni della sottostringa è simile alla sottostringa (int startIndex, int endIndex). Ora quando si passa il char viene automaticamente promosso a intero (endIndex) e quindi trattato come int.

0

Dai un'occhiata alla sezione 5.1.2, dove si discute di ampliare le conversioni.

0

Questo è noto come casting implicito. Lo stesso accade se assegni un valore int a un doppio. esempio rapida

double d = 1; 

1 è un int ma è implicitamente in double (1.0).

3

Altri hanno già spiegato il motivo per cui funziona, ma si noti che è una pratica scorretta utilizzare le variabili di tipo char per gli indici, poiché hanno una semantica associata diversa e quindi è confuso utilizzare un char come indice.

Utilizzare i caratteri solo per memorizzare i dati dei caratteri e probabilmente meglio: cercare di evitare del tutto il carattere, poiché non sono nemmeno abbastanza ampi da memorizzare ogni carattere (vedere la discussione Unicode e del punto di codice). Utilizzare int per memorizzare invece i punti di codice dei caratteri.

0

In char a = 3;, si potrebbe pensare ad esso come la memorizzazione 0011, il valore binario 3. Il carattere '3' non viene effettivamente memorizzato: Se si è tentato di trattamento è un char, non si otterrebbe 3. Ma se avete fatto

char a = '3';

Ora si sta memorizzare il char 3, un valore ASCII di 51, e se si è tentato di utilizzarlo come in int, si otterrebbe 51.

0

Tecnicamente, questo è perché char è un sottotipo di int.

Per determinare se substring(int,int) è applicabile all'argomento (int,char), per prima cosa proviamo 15.12.2.2 Phase 1: Identify Matching Arity Methods Applicable by Subtyping, abbiamo bisogno di verificare se char è un sottotipo di int. Per 4.10.1 Subtyping among Primitive Types, lo è.

Poi, per assegnare l'argomento char al parametro int, per 15.12.4.5 Create Frame, Synchronize, Transfer Control, applichiamo 5.3 Method Invocation Conversion, che converte char a int, per 5.1.2 Widening Primitive Conversion

Problemi correlati