Tengo las dos clases siguientes

Clase De Animal

class Animal {

  Map<String, A> data = new HashMap <String, A>();

  public void setValue(HashMap<String, ?> val)
   {
     this.data = val;
   }
  public Map getValue()
   {
    return this.data;
   }
}

Perro De La Clase

class Dog extends Animal {

  public void index()
  { 
    Map<String, A> map = new HashMap<String, A>();

    map.put("name", "Tommy");
    map.put("favfood", "milk"); //want to pass Lists, Integers also
    setValue(map);
  }
}

Como se puede ver en el código anterior, estoy tratando de configurar algunos valores con las teclas en index método, pero estoy recibiendo avisos de error de eclipse en dos archivos. Los Mensajes de Error son:

De Perro Archivo De Clase:

Multiple markers at this line
    - A cannot be resolved 
     to a type
    - A cannot be resolved 
     to a type

En Clase De Animal Archivo :

Multiple markers at this line
    - A cannot be resolved to a type
    - A cannot be resolved to a type
    - Incorrect number of arguments for type Map<K,V>; it cannot be parameterized with arguments 
     <HashMap<String,A>>

El tipo de datos de las claves en el HashMap siempre será una Cadena, pero los tipos de datos de valores sería aleatorio, por lo tanto estoy tratando de usar los medicamentos Genéricos.

Procedentes de PHP fondo todavía no he sido capaz de comprender el concepto de Java Generics. Por favor podría decirme dónde está el error en mi código?

  • Trate de evitar la mezcla de Genéricos y CRUDO tipo.
  • Lo que se supone que es?
  • Uso Map<String, Object> data = new HashMap<String, Object>() para almacenar cualquier tipo de valor
InformationsquelleAutor black_belt | 2014-10-10

5 Comentarios

  1. 1

    Mientras que este tipo de configuración no es la forma ideal para viajar, una solución es hacer que su Mapa un <String, Object> de tipo genérico. De esta manera usted puede poner lo que quiera en la parte del Objeto. Esto, sin embargo, ser un dolor de cabeza para tirar de esa información de vuelta. Esta es la forma en que veo tus clases cambiando.

    class Animal {
    
          Map<String, Object> data = new HashMap <String, Object>();
    
          public void setValue(Map<String, Object> map)
           {
             this.data = map;
           }
          public Map<String, Object> getValue()
           {
            return this.data;
           }
        }
    
    class Dog extends Animal {
    
          public void index()
          { 
            Map<String, Object> map = new HashMap<String, Object>();
    
            map.put("name", "Tommy");
            map.put("favfood", "milk"); //want to pass Lists, Integers also
            setValue(map);
          }
        }
    • Muchas gracias. Su trabajo 🙂
  2. 1

    Debe no ser el uso de un Map para esto; esto no es como PHP.

    Lugar se debe crear una clase que sabe el tipo de cada uno de sus campos:

    class Animal {
      String name;
      String favfood;
      int someIntegerField;
      List<Foo> someListField;
      ...
    }

    Usted realmente sólo debería ser el uso de un Map cuando todas las claves y todos los valores tienen el mismo tipo.

    • Gracias por su respuesta.Las teclas no son fijas, por lo que no puedo crear una clase como la de arriba.
    • ¿Por qué no las llaves fijas? ¿Cómo es tu aplicación debería funcionar, si no sabes qué campos están presentes y con qué tipos?
  3. 0
    A cannot be resolved to a type

    Simplemente significa que usted está usando la clase «A» que no existe. Por ejemplo, aquí Map<String, A> data que usted está diciendo, que va a crear el Mapa, donde cadena es la clave y el valor es de tipo «A».

    En comparación, este Map<String, Integer> significaría, que cree mapa, que ha de cadena como clave y entero como valor asociado a la clave.

    • He intentado utilizar ? pero no funciona así.
    • bueno, todo mal, no hay nada como «arreglar esto y se rok» :). Acabo de leer y probar algunos tutoriales en la web, a continuación, vuelva si algo no funciona.
  4. 0

    Su Map<String, A> tiene el tipo no definido A en su declaración.
    El problema es, que A nunca es especificado y por lo tanto no puede ser utilizado como un Tipo para nada.

    La solución sería utilizar el de tipo comodín o uso Object en lugar de A.

    Aquí están los dos ejemplos de soluciones:
    Map<String, ?> data = new HashMap <String, ?>();
    o
    Map<String, Object> data = new HashMap <String, Object>();

    La misma cosa tiene que ser aplicada en el mapa en su Dog clase.

  5. 0

    El problema es que no se puede simplemente introducir un parámetro de tipo en Java generics y esperar que funcione. Por ejemplo mirando el Animal clase:

    class Animal {
    
      Map<String, A> data = new HashMap <String, A>();
    
      public void setValue(HashMap<String, ?> val)
       {
         this.data = val;
       }
      public Map getValue()
       {
        return this.data;
       }
    }

    Parámetro de tipo A no está definido, por lo que en este caso, el compilador buscará un nombre de clase A. Usted puede resolver mediante la introducción de un parámetro de tipo para la clase:

    class Animal<A> { //<--- <A> introduces A as a type parameter
    
      Map<String, A> data = new HashMap <String, A>();
    
      public void setValue(HashMap<String, ?> val)
       {
         this.data = val;
       }
      public Map getValue()
       {
        return this.data;
       }
    }

    Sin embargo, el problema con esto es que usted necesita para definir A cuando se inicia un nuevo Animal por ejemplo:

    Animal<String> dog = new Animal<>();
    dog.setValue("name", "max");  //<---- ok
    dog.setValue("age", 13);      //<---- won't compile

    Lo que esto significa, sin embargo, es que su data Mapa mapa de de String a String, usted no será capaz de almacenar números enteros.

    Usted podría conseguir alrededor de esto mediante el uso de caracteres comodín, como este por ejemplo:

    class Animal {
    
      Map<String, ?> data = new HashMap <String, A>(); 
    
      public void setValue(HashMap<String, ?> val)
       {
         this.data = val;
       }
      public Map getValue()
       {
        return this.data;
       }
    }

    Ahora usted puede almacenar todo tipo de datos derivado de Object en el mapa, un String o incluso un Integer.

    Animal dog = new Animal();
    dog.setValue("name", "max");  //<---- ok
    dog.setValue("age", 13);      //<---- ok

    El problema con esta solución es que son sólo para recuperar los elementos de este mapa en un tipo de guardar manera.

    dog.getValue().get("name")  //<---- ok 
    Object name = dog.getValue().get("name")  //<---- ok 

    — pero —

    String name = dog.getValue().get("name")  //<---- won't compile

    Como en esta etapa, el tipo de información que se ha perdido y se queda con un mapa que los mapas String a Object

    • Gracias por tu tiempo y respuesta. Tengo la solución. Gracias a Chris Franklin. Preferí su solución porque yo necesarios para la puesta en valor de mi de una vez como esta setValue(map); muchas Gracias

Dejar respuesta

Please enter your comment!
Please enter your name here