[Java] メソッドの引数の型 と 返り値の型

わかりやすいJava_オブジェクト指向編を読んで勉強中。。

メソッドの引数にクラスを指定した場合

以下のコードでコンパイルエラーとなるのはどこ?

package jp.fernweh.typehinting;

public class C extends B {
  public static void main(String[] args) {
    C c = new C();
    B b = new B();

    C.arg_c(c);
    C.arg_c(b);
    C.arg_b(c);
    C.arg_b(b);
  }

  public static void arg_c(C c) {}
  public static void arg_b(B b) {}
}

class B {}

引数に指定された クラスorインターフェイス 継承or実装 したクラスのオブジェクトは引数として有効

メソッドの返り値にクラスを指定した場合

以下のコードでコンパイルエラーとなるのはどこ?

package jp.fernweh.returnclass;

public class A extends B {

  public static A test01() {
    return new A();
  }

  public static A test02() {
    return new B();
  }

  public static B test03() {
    return new A();
  }

  public static B test04() {
    return new B();
  }

}

class B {}

返り値に指定されたクラスorインターフェイス 継承or実装 しているクラスのオブジェクトならば返り血として有効

オーバーライドの拡張

以下のコードでコンパイルエラーとなるのはどこ?

package net.fernwelt.override.extension;

public class Child extends Parent {
  public A func1() {
    return new A();
  }

  public B func2() {
    return new B();
  }
}

class Parent {
  public B func1() {
    return new B();
  }

  public A func2() {
    return new A();
  }
}

class A extends B {}
class B {}

基本的には返り値の型が違うとオーバーライドできないけれど、 オーバーライドされるスーパークラスの メソッドの返り値として指定されているクラスを継承・実装したクラスを サブクラスのメソッドの返り値の型として使用することはできる。

Share
関連記事