簡體   English   中英

接口(兩種方法,不同的返回類型取決於類)Java

[英]Interface (two methods, different return types depending on class) Java

擴展接口的任何類都必須實現接口中聲明的方法。 不確定這是否可行,但我想做的是以下內容:

interface test {
   ____ get();
}

class A extends test {
  int val;

  A(int x) {
    val = x;
  }

  int get() {
    return Val;
  } 


  class B extends test {
  String val;

  B(String x) {
    val = x;
  }

  String get() {
    return Val;
  } 

是否可以使用能夠返回兩種不同數據類型的方法簽名?

不完全相同,但您可以使用泛型類型參數。

interface Test<T> {
    T get();
}

class A implements Test<Integer> {
    int val;

    A(int x) {
        val = x;
    }

    @Override
    public Integer get() {
        return val;
    }
}

class B implements Test<String> {
    String val;

    B(String x) {
        val = x;
    }

    @Override
    public String get() {
        return val;
    }
}

如您所見,您必然會使用Integer因為泛型不適用於基元。

另請注意,同一接口的這2個版本現在基本上是2個不同的接口。

不,這是不可能的。 該接口充當可用簽名的“綁定聯系人”。

如果你想要,你可以讓函數返回一個Object並允許不同的實現返回不同類型的值,但是:

  1. 它必須是引用,而不是原語。
  2. 你在通話現場放松了類型安全。

您可以使用泛型執行此操作,但不會在運行時強制執行。 您還應該使用implements來實現類中的接口,而不是extends

interface Test<T> {
   T get();
}

class A implements Test<Integer> {
    int val;

    A(int x) {
        val = x;
    }

    @Override
    Integer get() {
       return Val;
    } 

}

class B implements Test<String> {
    String val;

    B(String x) {
       val = x;
    }

    @Override
    String get() {
        return Val;
    }
}

泛型僅適用於類,因此您不得不使用Integer而不是int作為返回類型。

編譯,雖然我不確定我建議這樣做:

interface test {
   Object get();
}

class A implements test {
  int val;

  public A(int x) {
    val = x;
  }

  public Integer get() {
    return val;
  } 
}

class B implements test {
  String val;

  public B(String x) {
    val = x;
  }

  public String get() {
    return val;
  } 
}

在Java中使用返回類型覆蓋方法是合法的,返回類型是原始方法的返回類型的子類 這被稱為“協方差”。 它僅適用於返回類型,而不適用於參數。 請注意,要使其編譯,我必須在類A中使get返回Integer而不是int 另外:在實現接口時使用implements ,而不是extends ; 並確保在引用變量時使用正確的字母大小寫(發布的代碼中的Val不起作用)。

正如我所說的,我不確定我是否推薦這個,因為在任何聲明類型為test代碼中, get()的結果是一個Object ,你必須將其轉換為其他東西以使其有用。 如果可能,應該使用泛型。 但是,並非總是可行。 在編寫這樣的界面之前,我會仔細考慮你的設計。 可能是界面並不是你想要的。 但是,如果沒有更多關於你要完成什么的細節,我無法分辨。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM