que tienen las siguientes clases:¿Por qué el compilador declara que no existe una instancia máxima única?
public class Obj<T> extends BaseModel {
public static final String OBJECT = "object";
public Obj(T object) {
setObject(object);
}
public T getObject() {
return get(OBJECT);
}
public void setObject(T object) {
set(OBJECT, object);
}
}
Y ...
/** This is a 3rd party library class **/
public class BaseModel implements ModelData, Serializable {
//...members and stuff...
@SuppressWarnings({"unchecked", "rawtypes"})
public <X> X get(String property) {
X obj = null;
if (start > -1 && end > -1) {
Object o = map.get(property.substring(0, start));
String p = property.substring(start + 1, end);
if (o instanceof Object[]) {
obj = (X) ((Object[]) o)[Integer.valueOf(p)];
} else if (o instanceof List) {
obj = (X) ((List) o).get(Integer.valueOf(p));
} else if (o instanceof Map) {
obj = (X) ((Map) o).get(p);
}
} else {
obj = (X) map.get(property);
}
return obj;
}
}
Cuando compilo, me sale el siguiente error.
type parameters of <X>X cannot be determined; no unique maximal instance exists for type variable X with upper bounds T,java.lang.Object -> getObject()
Esto no sucede en Eclipse, el cual, por lo que yo puedo decir, está utilizando la misma JDK como mi construcción Ant. He visto el SO thread about the Sun compiler issue, pero eso parece ser para métodos estáticos que declaran tipos sobre la marcha.
¿Por qué me sale este error y, lo que es más importante, cómo lo soluciono?
Hasta ahora la única razón por la que he encontrado es para echar en mi método como este:
@SuppressWarnings({"unchecked"})
public T getObject() {
return (T) get(OBJECT); //yuck
}
diciendo a mi Estoy en la grieta y esta es la forma correcta es aceptable.
no puedo conseguir esto para reproducir con JDK 7 en el momento y un ejemplo más pequeño. Tenga en cuenta que Eclipse compila con su propio compilador interno. –
Otra forma de hacer esto sería proporcionar la llamada al método con el parámetro tipo: 'return get (OBJECT);' –
@ Paŭlo - eso no se compila. 'return get (OBJECT);' –
Snekse