2009-04-06 17 views
5

Estoy tratando de usar un constructor sobrecargado en Java que puede aceptar int[] o String. Obtengo un error de compilación, que parece indicar que en esta llamada de constructor sería ambiguo si la variable fuera una cadena null o una matriz null.Ambigüedad de constructor sobrecargada

¿Hay una manera fácil de evitar esto?

+0

Para el registro, no he aceptado una respuesta aquí, porque mi pregunta original fue tan equivocada que es difícil decir lo que es correcto. Gracias por la entrada –

Respuesta

16

el argumento a uno de los tipos:

Foo f1 = new Foo((int[]) null); 
// or 
Foo f2 = new Foo((String) null); 
5

La forma más sencilla - evitar null. Si es un String vacío, use ""; un int[] vacío usa new int[].

Para responder a la pregunta que puede utilizar un yeso o nula asignar a una variable:

new MyClass((String)null) 

final String nullString = null; 
new MyClass(nullString) 

El primero se prefieren generalmente, si va a hacerlo en absoluto.

4

quizás pueda agregar un constructor sin argumentos.

+0

Esa es probablemente la mejor solución si el valor nulo tiene algún significado específico. –

+0

Depende si la nueva MyClass ((String) null) y la nueva MyClass ((int []) null) significan lo mismo. (Me gustan mucho los métodos de creación estáticos en lugar de los constructores desnudos sobrecargados). –

2

Si tiene el control de la clase que desea crear una instancia, considere usar un método de fábrica estático para que pueda darles dos nombres separados y evitar la confusión relacionada con la sobrecarga.

public static Foo createFromIntArray(final int[] ints) { ... } 
public static Foo createFromString(final String str) { ... } 

De lo contrario, decida qué representa su nulo: ¿Es una matriz nula de ints, o una cadena nula? Es posible que la clase que está construyendo se comporte de manera diferente una sobre la otra. Una vez que sepa lo que representa su valor nulo, simplemente transfiéralo a ese tipo en la llamada al constructor.

new Foo((String) null); 
new Foo((int[]) null); 

Por último, parece que podría estar pasando una referencia de objeto a este constructor en lugar de una explícita null. Tal vez algo que obtenga de un java.util.Map. Si es así, puede probar este objeto con instanceof y convertirlo al tipo apropiado antes de enviarlo al constructor en cuestión.

Cuestiones relacionadas