Entonces, entiendo que lo siguiente no funciona, pero ¿por qué no funciona?¿Por qué no puedo usar un argumento de tipo en un parámetro de tipo con múltiples límites?
interface Adapter<E> {}
class Adaptulator<I> {
<E, A extends I & Adapter<E>> void add(Class<E> extl, Class<A> intl) {
addAdapterFactory(new AdapterFactory<E, A>(extl, intl));
}
}
El método add()
me da un error de compilación, "No se puede especificar cualquier adaptador enlazado adicional <E> cuando se une primero es un parámetro de tipo" (en Eclipse), o "parámetro de tipo no puede ser seguido por otros límites" (en IDEA), haga su elección.
Está claro que no está permitido utilizar el parámetro de tipo I
allí, antes del &
, y eso es todo. (Y antes de preguntar, no funciona si los cambias, porque no hay garantía de que I
no sea una clase concreta). ¿Pero por qué no? Revisé las preguntas frecuentes de Angelika Langer y no puedo encontrar una respuesta.
Generalmente, cuando una limitación de genéricos parece arbitraria, es porque ha creado una situación en la que el sistema de tipos no puede imponer la corrección. Pero no veo qué caso rompería lo que estoy tratando de hacer aquí. Diría que tal vez tiene algo que ver con el envío de métodos después del borrado de tipos, pero solo hay un método add()
, por lo que no es ambiguo ...
¿Alguien me puede demostrar el problema?
En realidad, si el punto de múltiples límites es controlar el borrado, eso tiene sentido, porque voy a borrar Objeto. –