Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多态重载_Java_Inheritance - Fatal编程技术网

Java 多态重载

Java 多态重载,java,inheritance,Java,Inheritance,我正在设计一个物理模拟器,里面有三种可以碰撞的东西 最基本的[抽象]类称为Item,它包含质量、位置和速度的信息 还有3种其他类型:Circle、Boundary和Photon,它们扩展了项类并具有自己的属性 我有一个名为system的列表,其中包含各种圆圈,边界等,我通过使用以下方法检查冲突:system.get(I).collide(system.get(j))并编辑速度等 我的问题是,Eclipse希望我在圆圈,边界中的每一个都有一个方法。。。名为collide(Item itemName

我正在设计一个物理模拟器,里面有三种可以碰撞的东西

最基本的[抽象]类称为
Item
,它包含质量、位置和速度的信息

还有3种其他类型:
Circle
Boundary
Photon
,它们扩展了
类并具有自己的属性

我有一个名为
system
列表,其中包含各种
圆圈
边界
等,我通过使用以下方法检查冲突:
system.get(I).collide(system.get(j))并编辑速度等

我的问题是,Eclipse希望我在
圆圈
边界
中的每一个都有一个方法。。。名为
collide(Item itemName)
的类,但通过这样做,编译器将无法对每种类型的项进行不同的处理

我目前在
边界
中有不同的方法。。。课程包括:

collide(Circle c){..}
collide(Boundary b){..}
collide(Photon p){..}
但是编译器需要一个通用的
collide(第一项)
方法


如何满足编译器的要求,但仍然像我一样使用继承来不同地处理不同类型的冲突?

您可以简单地保持
collide(Item b){..}
或类似的
collide(您可以简单地保持
collide(Item b){..}
或类似的
collide(您应该覆盖
collide>)(项目i)
用于每个子类。您可以在每个实现中检查
项目的类型,例如,在
光子
类中:

@Override
public void collide(Item item) {
    if (item instanceof Photon) {
         // implement collision of this with (Photon) item
    } else if ... {
        // I wonder how collision of Photon with Circle would look like :)
    }
}

这与为新类型重写对象的方法非常相似。

您应该为每个子类重写
collide(Item i)
。您可以在每个实现中检查
Item
的类型,例如,在
Photon
类中:

@Override
public void collide(Item item) {
    if (item instanceof Photon) {
         // implement collision of this with (Photon) item
    } else if ... {
        // I wonder how collision of Photon with Circle would look like :)
    }
}

这与为新类型重写对象的方法非常相似。

您仍然可以使用
collide(Item i)

但是,如果您希望方法对每个超类的行为有所不同,您可以这样做:

public void collide(Item i) {

    if(i instanceof Circle) { 
      //do something for a circle
    } else if(i instanceof Photon) {
      //do something for a photon
    } else if(i instanceof Boundary) {
      //do something for a boundary
    }
}

您仍然可以使用
collide(项目一)

但是,如果您希望方法对每个超类的行为有所不同,您可以这样做:

public void collide(Item i) {

    if(i instanceof Circle) { 
      //do something for a circle
    } else if(i instanceof Photon) {
      //do something for a photon
    } else if(i instanceof Boundary) {
      //do something for a boundary
    }
}

system.get(一)
返回一个
,编译器无法知道它是圆、边界还是光子。因此,
collide
方法必须使用
Item
参数。我建议真正需要回答的问题是,为什么首先需要不同版本的方法?
system.get(I)
返回一个
,编译器无法知道它是圆、边界还是光子。因此,
碰撞
方法必须采用
参数。我建议真正需要回答的问题是,为什么首先需要该方法的不同版本?能否给我一个例子?我从未使用过那种类型的代码before@chairharrison,kiruwka提供了一个更简单的解决方案:)你可以参考它,如果你想学习泛型,那么你可以学习我提供的链接。你能给我一个例子吗?我从来没有使用过那种类型的代码before@chairharrison,kiruwka提供了一个更简单的解决方案:)你们可以参考它,若你们想学习泛型,那个么你们可以学习我提供的链接