¿Genéricos de Java con comodín ilimitado?

Tengo una interfaz para convertir objetos en cadenas:

public interface Converter<T> {
    String asString(T object);
}

Y un mapa para almacenar todos los convertidores disponibles:

Map<Class<?>, Converter<?>> converterMap;

Ahora tengo una lista de datos heterogéneos para convertir así:

List<?> data = fetchData();
List<String> stringData = new ArrayList<>(data.size());
for (Object datum : data) {
    stringData.add(convertrMap.get(datum.getClass()).asString(datum));
}

Pero este código no compila:

error: method asString in interface Converter<T> cannot be applied to given types;
            stringData.add(converterMap.get(datum.getClass()).asString(datum));
  required: CAP#1
  found: Object
  reason: actual argument Object cannot be converted to CAP#1 by method invocation conversion
  where T is a type-variable:
    T extends Object declared in interface Converter
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?

¿Cómo debo cambiar el código?

Respuesta 1

Se enfrenta a un problema llamado captura con comodines . Java no puede identificar el tipo que se recibirá de los List<?>datos. Intente refactorizar su código en cualquiera de las dos formas

Método 1: cambie su interfaz de la siguiente manera

interface Converter {
    String asString(Object object);
}

Método 2: método auxiliar para capturar comodines por inferencia de tipos

Cree un método auxiliar como se muestra a continuación,

// Helper method created so that the wildcard can be captured
// through type inference.
private <T> void helper(List<T> data) {
    Map<Class<?>, Converter<T>> converterMap = null;
    List<String> stringData = null;

    for (T datum : data) {
        stringData.add(converterMap.get(datum.getClass()).asString(datum));
    }
}

Llame a este método auxiliar de la siguiente manera

List<?> data = fetchData();
helper(data);
Respuesta: 2

Estoy tratando de usar y comprender el método del escáner # findWithinHorizon de Java. He escrito el siguiente fragmento de código que utiliza este método, pero no puedo entender cómo funciona. privado ...

Estoy leyendo el HashMap.java. En la línea 917, los valores de la función () usaron valores variables. Sin embargo, busqué en todo el archivo java sin encontrar algunas variables definidas llamadas valores. ¿Cómo explicar esto? ...

Estoy trabajando en un archivo hexadecimal y mostrar su contenido, pero si el valor tenía "0". No apareció cuando lo imprimí. por ejemplo 0 0 0 b7 7a 7a e5 db 40 2 0 c0 0 0 9 18 16 0 e3 1 40 0 ​​0 3f 20 f0 1 5 ...

Entonces, mi profesor mencionó que una ruptura en una declaración if / if-else es un código "malo". ¿Qué quiere decir exactamente con eso? Además, ¿cómo puedo arreglar mi código que he escrito actualmente, porque lo hace ...