当前位置: 首页 > 知识库问答 >
问题:

类型不匹配:无法从映射转换为映射

况野
2023-03-14

我在解决泛型问题时遇到了一些麻烦。我有一个“猫”对象列表和一个“狗”对象列表,我需要将它们传递到同一个方法中。该方法的返回类型是一个“字符串”和“动物列表”的映射,我试图找出一种方法来将带有动物列表的映射转换为带有猫或狗列表的映射。

这工作很好,如果我有一个单独的方法猫和狗,但我正在寻找一个更灵活的解决方案。

标题中出现错误的行:

catMap = PetStore.groupAnimalsByOwner(cats); 
dogMap = PetStore.groupAnimalsByOwner(dogs);

注意:这是一个简化的例子,我必须能够使用地图中的列表作为“猫”或“狗”对象。

    public class Start {

    public static void main(String[] args) {

        Cat cat1 = new Cat("Jerry", "cat1");
        Cat cat2 = new Cat("Jerry", "cat2");
        Cat cat3 = new Cat("Fred", "cat3");

        List<Cat> cats = new LinkedList<Cat>();
        cats.add(cat1);
        cats.add(cat2);
        cats.add(cat3);

        Dog dog1 = new Dog("Frank", "dog1");
        Dog dog2 = new Dog("Jerry", "dog2");
        Dog dog3 = new Dog("Bob", "dog3");

        List<Dog> dogs = new LinkedList<Dog>();
        dogs.add(dog1);
        dogs.add(dog2);
        dogs.add(dog3);

        Map<String, List<Dog>> dogMap = new HashMap<String, List<Dog>>();
        Map<String, List<Cat>> catMap = new HashMap<String, List<Cat>>();

        // catMap should have 2 key/value pairs - key "Jerry" with a list containing cat1 and cat2
        // and a pair - key "Fred" with a list containing only cat3
        catMap = PetStore.groupAnimalsByOwner(cats); 

        // dogMap should have 3 key/value pairs - key "Frank" with a list containing dog1
        // key "Jerry" with a list containing dog2
        // Key "Bob" with a list containing dog3
        dogMap = PetStore.groupAnimalsByOwner(dogs);

    }

}
public class PetStore {

    //Grouping by owner
    public static Map<String, List<Animal>> groupAnimalsByOwner(List<? extends Animal> animals) {
        Map<String, List<Animal>> groupedMap = new HashMap<String, List<Animal>>();
        List<Animal> tempList = null;

        for (Animal summary : animals) {
            String consolidatedInvoiceId = summary.getOwner();
            tempList = groupedMap.get(consolidatedInvoiceId);
            if (tempList == null) {
                tempList = new LinkedList<Animal>();
            }
            tempList.add(summary);
            groupedMap.put(consolidatedInvoiceId, tempList);
        }

        return groupedMap;
    }
}
public interface Animal {

    public String getOwner();
}
  public class Cat implements Animal {

    private String owner;
    private String name;

    public Cat(String owner, String name) {
        this.owner = owner;
        this.name = name;
    }


    @Override
    public String getOwner() {
        return owner;
    }

    public String getName() {
        return name;
    }

    public void doCatStuff() {
        System.out.println("Do cat stuff");
    }

}

提前谢谢你。

共有1个答案

松旭
2023-03-14

正如列表 不是列表 一样,映射 > 也不是映射

GroupAnimalsByOwner方法设置为泛型,并将Animal作为上限,以便T推断为Cat(或Dog)。您需要在方法的正文中将Animal替换为t

public static <T extends Animal> Map<String, List<T>> 
         groupAnimalsByOwner(List<? extends T> animals)
{
    Map<String, List<T>> groupedMap = new HashMap<String, List<T>>();
    List<T> tempList = null;

    for (T summary : animals) {
        String consolidatedInvoiceId = summary.getOwner();
        tempList = groupedMap.get(consolidatedInvoiceId);
        if (tempList == null) {
            tempList = new LinkedList<T>();
        }
        tempList.add(summary);
        groupedMap.put(consolidatedInvoiceId, tempList);
    }

    return groupedMap;
}
 类似资料:
  • 我试图通过使用多个测试数据在Cucumber DataTable中使用映射来自动化一个场景。在本测试中,我们将向测试步骤传递两次Username和Password。所以我们的测试应该输入用户名和密码一次,点击登录按钮,并重复相同的步骤再次。 我已经尝试使用for循环来使用Maps集合重复测试。1.我收到一个错误,表示类型不匹配:无法从元素类型2。当我将其转换为时,我得到另一个错误,说明方法send

  • 问题内容: 我有以下几行代码 我认为第3行和第4行执行相同的任务,然后为什么编译器在第4行显示错误“类型不匹配:无法从long转换为int” 请帮忙。 问题答案: 这是因为复合赋值运算符会进行隐式转换。 从JLS复合分配运算符: 形式的复合赋值表达式等效于,其中是的类型,不同之处在于该表达式仅被评估一次。 对于二进制运算符,则必须显式进行强制转换。进行第四项作业: 它会工作。这就是您的复合赋值表达

  • 问题内容: 我正在使用ZXING库在JAVA中创建QR码生成器程序。该程序是 编译该程序时,出现类型不匹配错误, 在这条线 请帮忙!!! 问题答案: 我自己从未使用过该库,但是阅读错误消息时,我会假设您必须要以字节为单位存储字节的问题。问题将是一个字节由多个位组成,因此您不能仅通过一位表示一个字节。 将编码数据存储到ByteMatrix中,然后阅读以下内容: 使用zxing进行QR码编码和解码 完

  • 但它抱怨说: 如何同时解决这两个错误?

  • 我创建了一个AsyncTaskLoader: 在我的活动课上,我有这样的内容: