在Java中使用子类项列表时,如何避免降频?

问题描述 投票:0回答:1

我有一个抽象类A和类B和C,类B和C扩展了A,我需要把列表中的B和C固定在一起,比如说List。但是,B和C有独特的方法,所以并不是List中的所有项都可以用来调用某些方法的。除非我是在降调 这被认为是一种设计气味。

我需要将B和C保持在同一个列表中,因为我想根据它们的共享属性进行排序,我可以这样做。在这种情况下,把它们保持在同一个父类型的列表上,然后降序是否是一个不好的设计?

java oop inheritance arraylist downcast
1个回答
1
投票

我需要把B和C放在同一个列表中,因为我想根据它们的共享属性进行排序,我可以这样做。

只要要求保持列表中混合类型的排序即可 B, C 两者都延伸 A 来调用它们的非继承方法,你别无选择,只能使用 List<A> 包含所有类型。

虽然我也尽量避免降频,但这并不意味着在某些情况下它既无用也无必要。

for (A item: sortedList) {
    if (item instanceof B) {
        Whatever fieldB = ((B) item).getFieldB();  // using non-inherited method of B
    } else if (item instanceof C) {
         Whatever fieldC = ((C) item).getFieldC();  // using non-inherited method of C
    } else {
         // either only A or anything different that extends A
    }
}

从Java 14开始,由于 JEP 305: Pattern Matching for instanceof(模式匹配),这样的事物就会变得不那么啰嗦。

for (A item: sortedList) {
    if (item instanceof B b) {
        Whatever fieldB = b.getFieldB();  // using non-inherited method of B
    } else if (item instanceof C c) {
        Whatever fieldC = c.getFieldC();  // using non-inherited method of C
    } else {
        // either only A or anything different that extends A
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.