2016-10-16 155 views
1

比方說,有是2類:如何使用抽象類的子類型作爲抽象方法參數的類型?

  • Foo(一抽象類)
  • Bar(美孚的孩子)

我想要一個抽象的參數的類型函數Foo以匹配實現Foo的子類的類型(這樣的類可以是Bar)。

我想我可以使用受約束的泛型類型,但我不知道如何約束類型以匹配子類。

例子:

abstract class Foo { 
    public abstract boolean testSth([Type of the child] obj); 
} 

class Bar extends Foo { 
    @Override 
    public boolean testSth(Bar obj) { // I need the parameter to be of type Bar 
     // ... 
    } 
} 
+0

設置通用的任何擴展'Foo'。 – Li357

+0

那麼,你可以使用'抽象類Foo >'......這就是枚舉所做的事情。這不是一種理智的保證,但至少是一個開始。然後'酒吧'將延長'Foo '。 –

+1

爲什麼不簡單地聲明你的方法沒有泛型類型,並使用'Foo'就像'testSmth(Foo obj)'?由於我們無法創建這樣的類的實例,因此您肯定無法傳遞抽象的'Foo'類的實例。我們只能創建非抽象類的實例,所以你可以確定它是'Bar'的實例,或者是在某個點'Foo'處擴展的其他非抽象類的實例。 – Pshemo

回答

1

可以很明顯的,你只需要把這個孩子類型爲通用類型的父類:

abstract class Foo<T> { 
    // or Foo<T extends Foo<T>> 
    public abstract boolean testSth(T obj); 
} 

class Bar extends Foo<Bar> { 
    @Override 
    public boolean testSth(Bar obj) { // I need the parameter to be of type Bar 
     // ... 
    } 
} 
+4

你可能想'T擴展Foo ' –

+0

我實際上已經嘗試避免這種使用冗餘定義類類型的方法,但是我猜Java沒有提供任何構造來引用方法參數中的子類型,所以這個解決方案(不幸)是唯一可用的解決方案。 – sarasvati