Java 在哪里放置向下转换(在调用超类中的方法之前)?

Java 在哪里放置向下转换(在调用超类中的方法之前)?,java,inheritance,interface,Java,Inheritance,Interface,我正在做一项使用UnfolingMaps库()的作业 分配有一个名为CommonMarker的类。此类继承自类SimplePointMarker,该类继承自类AbstractMarker。AbstractMarker实现接口标记 我对调用isInside方法的selectMarkerIfHover方法中发生的强制转换感到困惑 下面是我们必须完成的基本代码。目标是为它找到的mouseX和mouseY所在的第一个标记设置实例变量lastSelected。我们将使用AbstractMarker抽象类中

我正在做一项使用UnfolingMaps库()的作业

分配有一个名为CommonMarker的类。此类继承自类SimplePointMarker,该类继承自类AbstractMarker。AbstractMarker实现接口标记

我对调用isInside方法的selectMarkerIfHover方法中发生的强制转换感到困惑

下面是我们必须完成的基本代码。目标是为它找到的mouseX和mouseY所在的第一个标记设置实例变量lastSelected。我们将使用AbstractMarker抽象类中定义的isInside(展开映射m,浮点x,浮点y)方法来检查位置是否在标记内部

lastSelected定义为:

private CommonMarker lastSelected;
给出的框架代码是:

private void selectMarkerIfHover(List<Marker> markers)
    {
        // TODO: Implement this method
    }
讲师给出的解决方案与我的略有不同,我的解决方案是在调用inInside之前就进行下推

for (Marker m : markers) 
        {
            CommonMarker marker = (CommonMarker)m;
            if (marker.isInside(map,  mouseX, mouseY)) 
            {
                marker.setSelected(true);                   
                lastSelected = marker;
                return;
            }
        }

我不确定为什么在调用方法isInside之前标记会被“降级”。这是最佳实践方法吗?请分享您的想法,我对Java非常陌生,我已经尽可能多地跟踪代码,但这对我来说仍然是一个巨大的挑战

只有一个区别:当
m
m提供
true
时,您的版本将抛出ClassCastException。isInside(map,mouseX,mouseY)
不是
CommonMarker
的实例

而第二种解决方案将在该列表中的任何标记不是
CommonMarker
的情况下引发该异常(准确地说:在某个
m
之前的任何对象,该对象为if条件的true)

从这个意义上说,在行为上存在着微妙的差异。这在你的环境中是否重要取决于你的环境。我的直觉是:如果这种差异在您的环境中很重要,那么我会将其视为一种设计气味,并进一步研究这种情况

除此之外:我认为这两种选择都是“好的”。但理想情况下,你会让事情更加明确,比如:

if (m instanceOf CommonMarker) {
  ... cast
} else {
  ... throw exception with meaningful error message
当然,第二个版本对性能的影响最小,因为每次循环迭代都会执行强制转换;而不是一次。但是instanceof/cast对于性能来说都是微不足道的


据说:许多人认为沉沦是一种设计气味。所以,再一次——我会后退一步,想想是否有其他选择可以完全避免这种沮丧

如果不知道哪些方法是在Marker接口中定义的,哪些方法只在CommonMarker中定义的,那么很难回答。@Eran、isInside和setSelected是在Marker接口中定义的。我认为您的问题标题有误导性。我自由地修改了它。如果你不高兴,就撤消我的更改。你的标题听起来更符合我的问题。谢谢你的编辑。回答得很好!但是你应该补充一点,一开始,低沉的情绪本身并不是一个好的练习…@TimothyTruckle我想写这个,但是被打断了。谢谢-考虑到这一点。
if (m instanceOf CommonMarker) {
  ... cast
} else {
  ... throw exception with meaningful error message