2010-03-15 23 views

Respuesta

284

No hay ningún mecanismo de alias de importación en Java. No puede importar dos clases con el mismo nombre y usarlas sin calificar.

Importar una clase y utilizar el nombre completo para el otro, es decir

import com.text.Formatter; 

private Formatter textFormatter; 
private com.json.Formatter jsonFormatter; 
+14

Esa es la respuesta correcta y solo agregaría lo que ha implicado: no, no existe dicha sintaxis de aliasing en Java. –

+10

¿Sigue siendo una limitación en Java 8? – HairOfTheDog

+5

@HairOfTheDog No, lamentablemente no hay solapamiento de importación se han añadido en Java8 – AdrieanKhisbe

15

Java no permite que hagas eso. Tendrá que consultar una de las clases por su nombre completo y solo importar la otra.

32

Es probablemente la pena señalar que Groovy has this feature:

import java.util.Calendar 
import com.example.Calendar as MyCalendar 

MyCalendar myCalendar = new MyCalendar() 
+9

En Scala es: 'import com.example. {Calendar => MyCalendar}' – pablisco

+7

Y en Kotlin: 'import com.example.Calendar as MyCalendar'. – KevinO

+3

En PHP es: use com \ example \ Calendar como MyCalendar – matang

30

Como las otras respuestas ya se ha dicho, Java no proporciona esta función.

La implementación de esta función se ha solicitado varias veces, p. como JDK-4194542: class name aliasing o JDK-4214789: Extend import to allow renaming of imported type.

De los comentarios:

Esto no es una petición razonable, aunque casi esencial. El ocasional uso de nombres completos no es una carga indebida (a menos que la biblioteca realmente vuelve a utilizar los mismos nombres simples derecha e izquierda, que es un mal estilo).

En cualquier caso, no pasa la barra de precio/rendimiento para un cambio de idioma .

así que supongo que no vamos a ver esta función en Java en el corto plazo :-P

+6

wow! no estabas bromeando sobre "no (...) en el corto plazo", veo que la solicitud de función fue descartada como azúcar inútil en 1998! Y cada intento de reabrir la discusión durante estos últimos 18 años se ha quedado en una referencia a esa antigua decisión. Supongo que sería más fácil convencer a los desarrolladores de IDE para implementar esto como una máscara en el editor que tratar de llevar el sentido a Oracle. – Superole

+0

Sin embargo, el viejo razonamiento es correcto: en la práctica, estos enfrentamientos casi nunca ocurren. – slim

+4

No estoy de acuerdo con que estos enfrentamientos raramente ocurran. La orientación del objeto favorece la nomenclatura simple. Puedo tener un empleado de clase de dos bibliotecas diferentes que hacen cosas separadas con un empleado (por ejemplo). –

-4

En realidad, es posible crear un acceso directo para que pueda utilizar nombres más cortos en su código haciendo algo como esto:

package com.mycompany.installer; 
public abstract class ConfigurationReader { 
    private static class Implementation extends com.mycompany.installer.implementation.ConfigurationReader {} 
    public abstract String getLoaderVirtualClassPath(); 
    public static QueryServiceConfigurationReader getInstance() { 
     return new Implementation(); 
    } 
} 

de ese modo sólo es necesario especificar el nombre largo de una vez, y usted puede tener tantas clases con nombres especiales que desee.

Otra cosa que me gusta de este patrón es que puede nombrar la clase de implementación igual que la clase base abstracta, y simplemente colocarla en un espacio de nombres diferente. Sin embargo, eso no está relacionado con el patrón de importación/cambio de nombre.

+7

Esta es una solución muy pobre. No trata completamente con la estática, puede requerir actualizaciones constantes y no ayuda con los problemas de de/serialización (como la deserialización de xml a través de jaxb). –

1

¿Hace esto lo que necesita?

public class Main {  
    private static final class AB extends a.B {} 
    private static final class BB extends b.B {} 

    public static void main(String[] args) { 
     AB ab = new AB(); 
     BB bb = new BB(); 
    } 
} 
+1

Esto podría funcionar, pero le dará problemas si intenta hacer algo reflexivo, o intenta crear un método público que devuelva uno de estos tipos. Puntos para la astucia, pero la inteligencia no es a menudo una buena idea en la práctica. –

Cuestiones relacionadas