Java Language Piège - Déclaration de classes avec les mêmes noms que les classes standard


Exemple

Parfois, les programmeurs novices en Java font l'erreur de définir une classe avec un nom identique à une classe largement utilisée. Par exemple:

package com.example;

/**
 * My string utilities
 */
public class String {
    ....
}

Ensuite, ils se demandent pourquoi ils obtiennent des erreurs inattendues. Par exemple:

package com.example;

public class Test {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

Si vous compilez puis essayez d'exécuter les classes ci-dessus, vous obtiendrez une erreur:

$ javac com/example/*.java
$ java com.example.Test
Error: Main method not found in class test.Test, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

Quelqu'un qui regarde le code de la classe Test verra la déclaration de main et regardera sa signature et se demandera de quoi la commande java se plaint. Mais en fait, la commande java dit la vérité.

Lorsque nous déclarons une version de String dans le même package que Test , cette version est prioritaire sur l'importation automatique de java.lang.String . Ainsi, la signature de la méthode Test.main est en fait

void main(com.example.String[] args) 

au lieu de

void main(java.lang.String[] args)

et la java commande ne reconnaît pas que comme une méthode de point d' entrée.

Leçon: Ne définissez pas les classes qui portent le même nom que les classes existantes dans java.lang ou d'autres classes couramment utilisées dans la bibliothèque Java SE. Si vous faites cela, vous vous exposez à toutes sortes d'erreurs obscures.