【问题标题】:Java method cast Arraylist of childclass to parentclass and reverseJava方法将子类的Arraylist转换为父类并反向
【发布时间】:2022-01-12 09:45:23
【问题描述】:

我有一个父类 Item 和多个子类 itemA、itemB 等。

现在我想要一个方法,它采用 2 个相同类类型的 ArrayList(例如 itemA,itemA)并根据父类中的方法映射项目(所以我的想法是制作一个采用 2父类的 Arraylists,因此它接受被强制转换为父类的子类的 Arraylists。

以下是该方法的外观:

HashMap<Item,Item> mapping(ArrayList<Item> prop1, ArrayList<Item> prop2)
{
    //Content of the method not that important
}

而且我应该能够使用子类的 Arraylists 调用该方法,例如

Arraylist<ItemA> list1 = ...;
ArrayList<ItemA> list2 = ...;
mapping(list1, list2);

但显然你不能轻易地在 Arraylist 之间进行转换。我唯一的想法是为 3 个类 itemA、itemB、itemC 编写 3 个单独的方法。有人有更好的主意吗?

【问题讨论】:

  • 为什么不使用类型参数绑定的泛型方法?
  • 顺便说一句:声明List&lt;...&gt;Map&lt;...&gt;,基于接口的变量。
  • @JoopEggen 你能详细说明一下吗?
  • 这是惯例;你会在任何地方看到它 - 有充分的理由。它被称为针对接口编程。实现类不影响使用,因此您可以更改实现。更重要的是:当接受 List 参数而不是 ArrayList 时,方法更通用。作为方法的返回结果,您可以返回任何合适的列表,例如 List.emptyList()Collections.singletonList(value) 或其他。
  • 拥有多种实现可供使用是该语言的一个不错的方面:一个 Map 可以是 HashMap,或者在键 TreeMap 上排序,或者在插入 LinkedHashMap 上排序。将此与脚本语言进行比较,您只有一个 moloch。

标签: java inheritance arraylist methods


【解决方案1】:

你需要这样的东西:

<T extends Item> HashMap<T, T> mapping(ArrayList<T> prop1, 
                                       ArrayList<T> prop2) {
    // ...
}

然后

Arraylist<ItemA> list1 = ...;
ArrayList<ItemA> list2 = ...;

HashMap<ItemA, ItemA> map = mapping(list1, list2);

请注意,类型系统将确保参数和结果使用相同的类型(ItemAItemB,等等)。


显然你不能那么容易地在 Arraylist 之间进行转换。

正确。 ArrayList&lt;Item&gt;ArrayList&lt;ItemA&gt; 等之间没有子类型关系

我唯一的想法是为 3 个类 itemA、itemB、itemC 编写 3 个单独的方法。

这 3 种方法必须具有不同的名称或属于不同的类。你会发现Java不会让你声明

HashMap<Item,Item> mapping(ArrayList<Item> prop1, 
                           ArrayList<Item> prop2)

HashMap<ItemA,ItemA> mapping(ArrayList<ItemA> prop1, 
                             ArrayList<ItemA> prop2)

在同一个类/接口中。方法签名必须是可区分的after type erasure

【讨论】:

  • 但是等等……你不能声明这 3 个方法吗?据我了解,这只是重载功能?类型擦除是什么意思?
  • 1) 重载的方法在类型擦除后需要区分。如果你不相信我……试试看。 2) 有关类型擦除的说明,请参阅baeldung.com/java-type-erasure
【解决方案2】:
<T extends Item> HashMap<T,T> mapping(ArrayList<T> prop1, ArrayList<T> prop2)
{
    //Content of the method not that important
}

【讨论】:

  • 啊,谢谢,我不知道泛型方法中的 T 可能是子类,因此可以访问这些方法 :)
  • 您可以为您的答案添加解释吗?作为一个新手,没有上下文可能很难理解解决方案
  • 它被称为泛型方法。你可以在这里阅读更多关于它的信息baeldung.com/java-generics
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多