Me encontré con un extraño error relacionado con Java usando Intellij Idea.

Así que no hay tal interfaz :

<T> void save(T aEntity, DbTransaction dbTransaction, Class<T> clazz);
<T> void save(Collection<T> aEntities, DbTransaction dbTransaction, Class<T> clazz);

Cuando intento compilar el siguiente código :

@SuppressWarnings("unchecked")
@Override
public void save(Collection<T> aEntities, DbTransaction aDbTransaction) {
    baseDao.save(aEntities, aDbTransaction, getClass((T) aEntities.toArray()[0]));
}

Recibo el siguiente error de compilación :

reference to save is ambiguous, both method <T>save(T,DbEntityHelper.DbTransaction,java.lang.Class<T>) in xzc.dao.IBaseDao and method <T>save(java.util.Collection<T>,DbEntityHelper.DbTransaction,java.lang.Class<T>) in xzc.dao.IBaseDao match

¿Tiene usted alguna idea ?
Gracias por la ayuda por adelantado.

¿qué es la firma para getClass()?
Cómo baseDao declarado? Es parametrizadas?
Nope, como se puede ver en el método de la firma, el T es «declarado» en los métodos de la firma. La interfaz no está parametrizada en todo.

OriginalEl autor StKiller | 2012-08-06

6 Comentarios

  1. 6

    Tiene dos tipos llamados T y no puede asumir que ellos son los mismos. T podría ser Collection<T> en el segundo método, o podría ser T en la primera.

    Puede utilizar

    baseDao.<T>save(....

    o

    baseDao.<Collection<T>>save(....

    para dejar claro que uno debe ser. Hacer de ellos el T mismo nombre no ayuda a que el compilador y sólo puede ser confuso.

    OriginalEl autor Peter Lawrey

  2. 2

    El borrado de las firmas de los dos métodos save se

    (Object, DBTransaction, Class)
    (Collection, DBTransaction, Class)

    y el compilador no puede decidir que usted desea llamar. Una conversión explícita debería ayudar aquí:

    baseDao.save((Collection)aEntities, aDbTransaction, getClass((T) aEntities.toArray()[0]));
    No ayuda. La solución con baseDao.<Colección<T>>guardar funciona bien.

    OriginalEl autor Ian Roberts

  3. 1

    Por lo general me sale este tipo de error, ya que el tipo de borrado.

    Compruebe los otros métodos en el código para asegurarse de que todos ellos son distintas cuando se remueve de hte tipo de información. Si hay dos o más de la misma, entonces esta podría ser su prolem.

    Para la supresión ver esto en el camino de java
    http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

    Puede publicar el resto de la clase?

    OriginalEl autor RNJ

  4. 1

    Intentar especificar el tipo de <T> explícitamente como en el siguiente:

    baseDao.<Collection<T>>save(aEntities, aDbTransaction, getClass((T) aEntities.toArray()[0]));

    OriginalEl autor Vic

  5. 0

    Haga clic en donde el texto es de color diferente, y elegir importar la clase específica de save() (usando la tecla de acceso directo – Mac es Alt-Enter). Como alternativa, puede utilizar el nombre de clase completo para diferenciar entre los dos tipos de save() métodos.

    OriginalEl autor Makoto

  6. 0

    Debido a tipo de borrado, los dos métodos tienen la misma firma.

    Brevemente, en el tiempo de ejecución de todo tipo de información se borra, por lo que los dos métodos se convierten de hecho en:

    Object void save(Object aEntity, DbTransaction dbTransaction, Class clazz);
    Object void save(Collection aEntities, DbTransaction dbTransaction, Class clazz);

    Debido a que el parámetro es un Collection, pero la T de la colección no es necesariamente el mismo T como el otro método, por lo que ambos métodos pueden coincidir.

    Intentar una conversión explícita a Collection o Object.

    De verdad ? Cómo puede ser T ( Objeto ) ser equivalente a la Colección de<T> ( Colección ) ?
    la colección es un objeto demasiado, creo.
    pero no el compilador de seleccionar el método más específico ?
    compilador no puede saber con certeza. Lo que si se tiene un Objeto variable que apunta a una colección como contraposición a la variable de Objeto que apunta a lo que sea.

    OriginalEl autor Bohemian

Dejar respuesta

Please enter your comment!
Please enter your name here