2017-09-26 2 views
1

j'apprends le développement Android, et j'ai remarqué la documentation pour findViewById() dire que la coulée de son objet retourné est inutile:Déterminer si la fonctionnalité du langage Java est disponible notamment SDK Android (plate-forme)

<Android API 26 Platform> 
... resulting view is automatically cast to the target class type... 

I Je préfère ne pas lancer si je n'ai pas besoin de (moins de code pour écrire et lire!), mais cela semble être une fonctionnalité de Java 8. Pourtant, j'aimerais que mon application fonctionne sur des plateformes aussi vieilles que 19 (Kitkat).

La page https://developer.android.com/studio/write/java8-support.html ne semble pas couvrir la coulée de type automatique disponible en Java 8, et diverses questions/réponses sur SO indiquent que certaines fonctionnalités de Java 8 sont disponibles jusqu'au SDK 9.

Premièrement, comment puis-je savoir si une fonctionnalité de langage Java est dans ma gamme de SDK cible? Deuxièmement, comment est-il possible que de nouvelles fonctionnalités linguistiques soient prises en charge dans l'API de plate-forme vieille de plusieurs années?

+3

* cela semble être une fonctionnalité Java 8. * - cela n'a rien à voir avec la version java. Cela dépend de la syntaxe dans le SDK Android, qui a changé dans la version 26, donc si vous targetSdk 26 vous pouvez utiliser cette fonctionnalité –

+0

@TimCastelijns Merci pour la clarification, mais ce n'est pas tout à fait vrai: vous pouvez l'utiliser aussi longtemps que compileSdk> = 26 , indépendamment du SDK cible. En outre, cela n'invalide pas ma question car [Android prend en charge ... un sous-ensemble de fonctionnalités de langage Java 8 qui varient selon la version de la plate-forme] (https://developer.android.com/guide/platform/j8-jack.html). – Schollii

Répondre

1

Vous n'avez pas à lancer l'objet retourné par findViewById() si votre compileSdkVersion is >= 26 est Android O. Il n'est pas lié à java 8.

Android Studio affiche une erreur ou un avertissement en fonction de l'API si une API particulière n'est pas prise en charge ou déconseillée.

0

Les messages indiquent que "cela n'a rien à voir avec Java 8". Cela semble ne que partiellement correct, d'une manière qui n'invalide pas mes 2 questions. Voici donc mes propres conclusions, basées sur des lectures supplémentaires que j'ai faites depuis mon OP, et je vais le corriger en fonction des réponses.

Les documents officiels sont clairs: Android supports ... a subset of Java 8 language features that vary by platform version.

Notez les termes "caractéristique du langage", pas "API". Ce dernier signifie généralement les constantes, les classes et les membres de classe (et pour les méthodes, leurs signatures) définis dans un SDK particulier et accessible/appelable à partir de votre code; alors que "SDK" et "API" sont souvent utilisés de manière interchangeable, ils ne sont probablement pas les mêmes sur Android: le SDK est probablement API + outils (comme le compilateur, le transpiler, les scripts pour la vérification des erreurs, etc.).

La citation implique que le niveau du SDK augmente, de plus en plus langue fonctionnalités de Java 8 SPEC deviennent pris en charge. Le mot clé est "pris en charge": si la fonction de langue A est prise en charge au SDK 27 mais pas à 26, et vous compilez votre programme avec compileSdk: 27, et il fonctionne correctement sur un appareil Android avec plate-forme 26 (ceci suppose que votre programme ne utiliser l'une des nouvelles API 27, il utilise simplement les nouvelles fonctionnalités du langage comme un nouvel opérateur etc), quelle magie est en jeu? La seule explication que j'ai (et j'espère que la réponse à la deuxième question dans mon OP) est la compilation supplémentaire que je ne savais pas quand j'ai posté: le bytecode Java (fichier .class) généré à partir de la Le compilateur Java est transpilé au format DEX. Cette étape supplémentaire implique un outil, qui ne fait pas partie de l'API, mais fait probablement partie du SDK. Ce compilateur DEX est où langue fonctionnalités sont implémentées: si le compilateur DEX ne sait pas comment transplanter un bytecode Java, alors cet opérateur n'est pas supporté par Android. Cela suggère que lorsque c'est possible, les nouveaux bytecodes Java ne sont probablement pas convertis en nouveaux bytecodes DEX; à la place, ils sont convertis en une séquence équivalente de codes secondaires DEX qui exécutent l'opération sur l'ancienne plate-forme (qui a une ancienne machine virtuelle Dalvik).Quand une telle équivalence est trop onéreuse à déterminer, c'est quand le minSdk est affecté (il n'y a tout simplement pas moyen qu'une vieille machine Dalvik puisse exécuter les fichiers DEX). Pour ma première question, chaque SDK inclut probablement des «règles d'inspection» qui vérifient les fonctionnalités Java JDK qui ne sont pas encore supportées par le compilateur DEX, ce qui permet de savoir si une fonctionnalité de langage JAVA est supportée dans un SDK donné la gamme est de pelucher, et supposer que les règles d'inspection utilisées par le linter drapeau tous les problèmes correctement (pas de faux positifs ou négatifs).

Toutes les corrections sont les bienvenues!