Se si utilizza Android Studio , la lingua Java 7 deve essere abilitata automaticamente senza patch. Try-with-resource richiede API Level 19+ e mancano elementi NIO 2.0.
Se non puoi usare le funzionalità di Java 7, vedi la risposta di @Nuno su come modificare il tuo build.gradle
.
Quanto segue è solo per interesse storico.
Una piccola parte di Java 7 può certamente essere utilizzata con Android (nota: ho testato solo su 4.1).
Prima di tutto, non è stato possibile utilizzare l'ADT di Eclipse perché è codificato che solo i compilatori Java 1.5 e 1.6 sono conformi. Potresti ricompilare ADT ma trovo che non ci sia un modo semplice per farlo oltre a ricompilare l'intero Android insieme.
Ma non è necessario utilizzare Eclipse. Ad esempio, Android Studio 0.3.2 , IntelliJ IDEA CE e altri IDE basati su javac supportano la compilazione su Android e si potrebbe impostare la conformità fino a Java 8 con:
- File → Struttura del progetto → Moduli → (seleziona il modulo nel secondo riquadro) → Livello lingua → (scegli "7.0 - Diamanti, ARM, multi-catch, ecc.")
Ciò consente solo le funzionalità del linguaggio Java 7 e difficilmente si può trarre vantaggio da qualsiasi cosa, dal momento che la metà del miglioramento proviene anche dalla libreria. Le funzionalità che è possibile utilizzare sono quelle che non dipendono dalla libreria:
- Operatore Diamond (
<>
)
- Interruttore di stringa
- Cattura multipla (
catch (Exc1 | Exc2 e)
)
- Sottolineatura in numeri letterali (
1_234_567
)
- Letterali binari (
0b1110111
)
E queste caratteristiche non possono essere utilizzate ancora :
- L'
try
istruzione -with-resources - perché richiede l'interfaccia inesistente "java.lang.AutoCloseable" (può essere utilizzata pubblicamente in 4.4+)
- L'annotazione @SafeVarargs - perché "java.lang.SafeVarargs" non esiste
... "ancora" :) Si scopre che, sebbene la libreria di Android abbia come target 1.6, la fonte Android contiene interfacce come AutoCloseable e interfacce tradizionali come Closeable eredita da AutoCloseable (SafeVarargs è davvero mancante). Potremmo confermare la sua esistenza attraverso la riflessione. Sono nascosti semplicemente perché Javadoc ha il @hide
tag, che ha fatto sì che "android.jar" non li includesse.
Esiste già una domanda esistente: come faccio a creare l'SDK Android con le API nascoste e interne disponibili? su come recuperare quei metodi. Devi solo sostituire il riferimento "android.jar" esistente della piattaforma attuale con quello personalizzato, quindi molte delle API Java 7 saranno disponibili (la procedura è simile a quella di Eclipse. Verifica struttura del progetto → SDK).
Oltre a AutoCloseable, vengono rivelate (solo) le seguenti funzionalità della libreria Java 7 :
- Costruttori di concatenamento di eccezioni in ConcurrentModificationException, LinkageError e AssertionError
- I metodi statici .compare () per le primitive: Boolean.compare (), Byte.compare (), Short.compare (), Character.compare (), Integer.compare (), Long.compare ().
- Valuta : .getAvailableCurrencies (), .getDisplayName () (ma senza .getNumericCode ())
- BitSet : .previousSetBit (), .previousClearBit (), .valueOf (), .toLongArray (), .toByteArray ()
- Collezioni : .emptyEnumeration (), .emptyIterator (), .emptyListIterator ()
- AutoCloseable
- Throwable : .addSuppressed (), .getSuppressed () e il costruttore a 4 argomenti
- Carattere : .compare (), .isSurrogate (), .getName (), .highSurrogate (), .lowSurrogate (), .isBmpCodePoint () (ma senza .isAlphabetic () e .isIdeographic ())
- Sistema: .lineSeparator () (non documentato?)
- java.lang.reflect.Modifier : .classModifiers (), .constructorModifiers (), .fieldModifiers (), .interfaceModifiers (), .methodModifiers ()
- Interfaccia di rete : .getIndex (), .getByIndex ()
- InetSocketAddress : .getHostString ()
- InetAddress : .getLoopbackAddress ()
- Registratore : .getGlobal ()
- ConcurrentLinkedDeque
- AbstractQueuedSynchronizer : .hasQueuedPredecessors ()
- DeflaterOutputStream : i 3 costruttori con "syncFlush".
- Deflater : .NO_FLUSH, .SYNC_FLUSH, .FULL_FLUSH, .deflate () con 4 argomenti
Questo è praticamente tutto. In particolare, NIO 2.0 non esiste e Arrays.asList non è ancora @SafeVarargs.