Как реализовать Java Hashmap с различными объектами в качестве значений - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу проанализировать YAML-файл через Джексона, но столкнулся с проблемой, заключающейся в том, что в одном из свойств (назовем его «Событие») есть строка с именем «тип» и объект «свойства», которые различаются для разных событий. Моя проблема в том, что мне нужно определить POJO для этого YAML. Поэтому я хочу определить Hashmap с помощью VariableObject, который может быть любым из некоторых предопределенных классов (для краткости, скажем, Shipping and Inventory).

Как я могу реализовать Hashmap таким образом?

public class Event {
    private static String type;
    private static Map<String, VariableObject> properties;

    public static void main(String[] args) {
        Inventory inventory = new Inventory("inventoryName", 13);
        properties.put("Inventory", inventory);
        Shipping shipping = new Shipping("shippingName", true);
        properties.put("Shipping", shipping);
    }
}


public class Inventory {

    private static String name;
    private static int someNumber;

    public Inventory(String name, int someNumber) {
        this.name = name;
        this.someNumber = someNumber;
    }
}


public class Shipping {

    private static String name;
    private static boolean someBoolean;

    public Shipping(String name, boolean someBoolean) {
        this.name = name;
        this.someBoolean = someBoolean;
    }
}

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

То, что вы говорите, просто Object. Это самый специфический общий суперкласс:

private static Map<String, Object> properties;

Другим решением было бы заставить Inventory и Shipping реализовать некоторый общий интерфейс, например Named, и использовать его в качестве параметра типа в HashMap.

1 голос
/ 18 апреля 2019

Один из способов сделать это - заставить Shipping и Inventory реализовать один и тот же интерфейс (например, VariableObject в вашем cas)

public class Event {
    private static String type;
    private static Map<String, VariableObject> properties;

    public static void main(String[] args) {
        Inventory inventory = new Inventory("inventoryName", 13);
        properties.put("Inventory", inventory);
        Shipping shipping = new Shipping("shippingName", true);
        properties.put("Shipping", shipping);
    }
}

public interface VariableObject{
//you can define common methods here if you want
}


public class Inventory implements VariableObject{

    private static String name;
    private static int someNumber;

    public Inventory(String name, int someNumber) {
        this.name = name;
        this.someNumber = someNumber;
    }
}


public class Shipping implements VariableObject{

    private static String name;
    private static boolean someBoolean;

    public Shipping(String name, boolean someBoolean) {
        this.name = name;
        this.someBoolean = someBoolean;
    }
}
...