Получение несовместимой ошибки для родительских дочерних классов java

У меня определена HashMap:

        HashMap<String,ArrayList<Thing>> hashmap = new HashMap<>();

Мне нужен ArrayList, так как я хочу, чтобы один ключ имел несколько значений. Это было лучшее решение, которое я нашел для этой проблемы. Класс Thing - это родительский класс для множества других классов. Проблема в том, что когда я пытаюсь добавить, я получаю сообщение об ошибке.

 hashmap.put(b, world.ports);

Это ошибка:

no suitable method found for put(String,ArrayList<SeaPort>)
method Map.put(String,ArrayList<Thing>) is not applicable
  (argument mismatch; ArrayList<SeaPort> cannot be converted to ArrayList<Thing>)
method AbstractMap.put(String,ArrayList<Thing>) is not applicable
  (argument mismatch; ArrayList<SeaPort> cannot be converted to ArrayList<Thing>)
method HashMap.put(String,ArrayList<Thing>) is not applicable
  (argument mismatch; ArrayList<SeaPort> cannot be converted to ArrayList<Thing>)

` Я этого не понимаю, поскольку SeaPort расширяет Вещь, разве он не должен быть совместимым? Я прочитал кучу восходящих и отрицательных веток, но не понимаю, как они применимы здесь. Вот класс Thing:

package seaportprogram;

import java.util.Scanner;


public class Thing implements Comparable<Thing>{
String name;
int index;
int parent;
World world;

public Thing(){
    name = null;
    index = 0;
    parent =0;
}

//Thing Scanner Constructor
public Thing (Scanner sc){
if (sc != null){
name = sc.next();
index = sc.nextInt();
parent = sc.nextInt();
    }
}

// Get Index
public int getIndex(){
    return index;
}
//Get Name
public String getName(){
    return name;
}
//Get Parent
public int getParent(){
return parent;
}
//Thing To String
public String toString(){
return name + " " + index;
}
//Auto-Gen Compare Method
@Override
public int compareTo(Thing o) {
    // TODO Auto-generated method stub
    return 0;

}

}//End - Class Thing

Вот класс SeaPort:

package seaportprogram;

import java.util.ArrayList;
import java.util.Scanner;

class SeaPort extends Thing {
ArrayList<Dock> docks;
ArrayList<Ship> que;
ArrayList<Ship> ships;
ArrayList<Person> persons;

//Sea Port Scanner Constructor
public SeaPort(Scanner sc){

    super(sc);
    docks = new ArrayList<>();
que = new ArrayList<>();
ships = new ArrayList<>();
persons = new ArrayList<>();
}
//Set Docks
public void setDocks(ArrayList<Dock> docks){
    this.docks = docks;
}
//Get Docks
public ArrayList<Dock> getDocks(){
    return docks;
}
//Set Ships
public void setShips(ArrayList<Ship> ships){
    this.ships = ships;
}
//Get Ships
public ArrayList<Ship> getShips(){
    return ships;
}
//Set Que
public void setQue(ArrayList<Ship> que){
    this.que = que;
}
//Get Que
public ArrayList<Ship> getQue(){
    return que;
}
//Sea Port To String
public String toString(){

String string = "\n\n Sea Port: " + super.toString() + "\n";

for(Dock md: docks){
        string += "\n" + md + "\n";
}

string += "\n\n --- List of all ships in Que: ";

for(Ship ms: que){
        string += "\n  > " + ms;
}

string += "\n\n --- List of all Ships:";

for(Ship ms: ships){
        string += "\n  > " + ms;
    }

string += "\n\n --- List of all Persons:";

for(Person mp: persons){
        string += "\n  > " + mp;
}
return string;

}//End 


}// End Sea Port Class

Это мировой класс:

package seaportprogram;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class World extends Thing{

ArrayList<SeaPort> ports;
PortTime time;

//World Scanner Constructor
public World(Scanner sc){
    super (sc);
ports = new ArrayList<>();
}
//Set Ports
}

Как это сделать? TIA! Обновить: Я пытаюсь распечатать карту и получаю исключение с нулевым указателем. Я думаю, это потому, что список инициализируется как в морском порту, так и в классе MyHashMap. Кажется, я не могу найти способ обойти это, и я даже не уверен, что это причина ошибки. Вот toString ():

          public String toString(){
        if (map.isEmpty())
         {
             System.out.println("The hashMap is empty");
             return "empty";
         }
        String display = " ";
        Iterator<String> itr = map.keySet().iterator();
        while (itr.hasNext()) {
            display =display + itr.next();
            Iterator<ArrayList<T>> itr2 = map.values().iterator();
            while (itr2.hasNext()) {
                display +=itr2.next();
            }
        }

    return display;
    }

и это призыв к нему из графического интерфейса:

 jta.setText(map.toString());
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
519
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Seaport может расширять Thing, но ArrayList<SeaPort> не расширяет ArrayList<Thing>.

Если вы просто хотите сохранить карту от строк к вещам, вам не нужен ArrayList. Если вы действительно хотите сопоставить строки со списками вещей, вы не можете сделать это так.

Мне нужен ArrayList, так как я хочу, чтобы один ключ имел несколько значений. Это было лучшее решение, которое я нашел для этой проблемы. Как это сделать?

Fatima 09.04.2018 17:17
Ответ принят как подходящий

ArrayList<Derived_Class> не расширяет ArrayList<Base_Class>.

Если вы хотите использовать такой HashMap, одним из решений может быть создание собственного класса-оболочки с использованием шаблонов:

import java.util.ArrayList;
import java.util.HashMap;

public class MyHashMap<T extends Thing> {
    private HashMap<String, ArrayList<T>> map;

    public MyHashMap() {
        map = new HashMap<>();
    }

    public void add(String s, T element) {
        ArrayList<T> list = null;
        if ((list = map.get(s)) == null)
            map.put(s, list = new ArrayList<T>());
        list.add(element);
    }

    public ArrayList<T> get(String s) {
        return map.get(s);
    }
}

если вам нужна HashMap of SeaPorts, вы можете создать новую HashMap следующим образом:

MyHashMap<SeaPort> map = new MyHashMap<SeaPort>();

и использовать настраиваемые сеттеры и геттеры для доступа к массивам

Спасибо за помощь. Я попробую это.

Fatima 09.04.2018 18:15

Я инициализировал MyHashMap с помощью: MyHashMap (); и я пытаюсь добавить на карту с помощью MyHashMap.add (b, port); и я получаю эту ошибку: на нестатический метод add (String, T) нельзя ссылаться из статического контекста, где T - это переменная типа: T extends Thing, объявленный в классе MyHashMap ----

Fatima 09.04.2018 18:50

add - это метод класса MyHashMap, поэтому вы должны вызвать его на карте, которую вы инициализировали, то есть MyHashMap <Your_Thing_Class> map = new MyHashMap <Your_Thing_Class> (); map.add ("строка", obj);

Todde 09.04.2018 19:10

Можете ли вы еще раз взглянуть на вопрос? Я добавил больше нового кода. Я получаю еще одну ошибку при попытке печати. Еще раз спасибо

Fatima 09.04.2018 20:50

это в другом вопросе, это хорошая практика, чтобы иметь только один для каждой темы, чтобы держать вещи в чистоте. вы должны принять мой ответ, если вы считаете, что ваша проблема решена, тогда вы можете открыть другую тему о своем исключении, сообщить все подробности, и я или кто-то другой будет очень рад вам помочь

Todde 10.04.2018 11:47

Спасибо за помощь, Тодде! Я наконец научился принимать ответ. Но решили не выполнять этого. Это слишком абстрактно, и я не могу заставить его работать. Я попробую по-другому.

Fatima 10.04.2018 22:16

Другие вопросы по теме