在Granparent类上使用instanceof来抽象具有非抽象子类的类

时间:2019-07-28 18:29:51

标签: java class subclass instanceof

我的代码有问题。我有一个祖父母班,一个抽象父母班,有非抽象的孩子

public class GrandParent () {
// codes here
}


public abstract class Parent1 extends GrandParent () {
// codes here
}

public class A extends Parent1 () {
// codes here
}

public class B extends Parent1 () {
// codes here
}

我还有另外一堂课,在那里我放所有东西。我创建了一个祖父母类的数组列表,其中包含父类的孩子。当我尝试使用instanceof时,它给了我一个错误,我不明白为什么。父类是Granparent的子类,但是为什么会发生错误?

public class Main () {
    ArrayList <GrandParent> gps;

    public Main () {
       gps = new ArrayList<> ();

       gps.add(new A());
       gps.add(new B());

    }

    public void method () {
       if(gps.get(0) instanceof Parent1) {   // in here i get an error that says inconvertible types; cannot cast GrandParent to java.util.Parent1
           //codes
       }

1 个答案:

答案 0 :(得分:0)

这里似乎有一些问题。首先,类Main中的主要方法必须为public static void main (String[] args)。这就是Java对main方法的期望。然后ArrayList必须是静态的,否则,如果在类级别定义了main,则不能引用它。另外,您可以在method()方法中定义gps,然后将其作为参数传递给()

还要注意,您将instanceof放在班级名称之后。那是不对的。仅方法应具有参数列表。

现在代码处于可以解决任何其他问题的状态。请记住,A应该能够转换为父类型来进行检查。父类型是否抽象并不重要。这无关紧要。因此,没有理由为什么它不能检查BParent1是否为Parent1类型。 public class Main { public static void main (String [] args) { GrandParent baz = new A(); GrandParent biz = new B(); if (baz instanceof Parent1) System.out.println("hi"); if (biz instanceof Parent1) System.out.println("hi again"); } } 是否抽象并不重要。为了证明这一点,请看下面的小例子。

ArrayList

如果运行此命令,则没有错误,并且输出“ hi”和“ hi hi”都被打印。这类似于代码中发生的事情,因为GrandParent gps中的元素是对AB类型的对象的import java.util.ArrayList; class GrandParent { // codes here } abstract class Parent1 extends GrandParent { // codes here } class A extends Parent1 { // codes here } class B extends Parent1 { // codes here } public class Main { public static ArrayList<GrandParent> gps; public static void main (String [] args) { gps = new ArrayList<>(); gps.add(new A()); gps.add(new B()); } public static void method () { if(gps.get(0) instanceof Parent1) { // in here i get an error that says inconvertible types; cannot cast GrandParent to java.util.Parent1 { //Codes here } } } } 引用。

这是应用了更正的代码。请注意,每个类都在其自己的文件中,因为它们都是公共类:

def __init__(self, make, model, year, color, kilometers, pre_owned, price):
    cars.append(self)

但是还有另一件事。从软件设计的角度来看,让代码依赖类型检查不是一个好主意。换句话说,程序的行为不应取决于显式检查此类的类型。最好在类本身中定义该行为。例如,您可以覆盖子类中的方法以定义与其祖先不同的行为。同样,您可以在类中提供接口的实现。请注意,这两种方法都不要求显式类型检查。