2009-04-08 127 views
5

我有一個具有抽象getType()方法的基類。我希望子類能夠實現此方法並提供實際的類來使用。返回Java中的嵌套類類型

在代碼中,類似如下:

public abstract class A { 
    public static interface Tile; 

    protected abstract Class<Tile> getTileClass(); 
} 

public class B extends A { 
    public static class MyTile implements A.Tile { } 

    @Override 
    protected abstract Class<A.Tile> getTileClass() { 
     MyTile t = new MyTile(); // WORKS 
     return MyTile;   // ERROR HERE 
    } 
} 

這裏的問題是,我得到了標線「MyTile解決不了」。所以我想回到這個代替:

回報新MyTile()的getClass()

但現在Eclipse的告訴我:

類型不匹配:不能從 轉換類<捕獲#1的? B.MyTile > 延伸到<類A.Tile >

,我甚至不知道是否有可能在Eclipse中的錯誤在這裏頂(捕獲#1?)。

接下來,我放棄接口並嘗試使用抽象基類Tile類。從Eclipse的一些幫助,我結束了下面的代碼看起來編譯:

public abstract class A { 
    public static abstract class Tile; 

    protected abstract Class<? extends Tile> getTileClass(); 
} 

public class B extends A { 
    public static class MyTile exends A.Tile { } 

    @Override 
    protected abstract Class<? extends A.Tile> getTileClass() { 
     return new MyTile().getClass(); // WORKS 
     return MyTile;     // "Cannot be resolved" 
    } 
} 

所以我基本上似乎有三個問題:

1)是否有可能得到這個與工作.Tile是一個接口?

2)使用基類時,是否真的是正確的路要走?

3)如何從方法內部返回嵌套的B.MyTile類引用?必須做new MyTile().getClass()不可能是對的,可以嗎?

+0

可能返回`Class`而不是非反射對象是一個壞主意。 – 2009-04-08 19:41:27

+0

@Tom在檢查類型的上下文中返回類是一種非常常見的模式,它允許您在運行時檢查* checked *類型的集合,例如集合。我不知道其他方式,其實... – Varkhan 2009-04-08 21:28:20

回答

6

泛型和協變類型重寫不能很好地協同工作。你必須明確聲明getTileClass()返回一個類,該類可以是A.Tile的子類

您也可以通過MyTile.class訪問MyTile的類對象而無需實例化它。

試試這個:

public abstract class A { 
    public static interface Tile; 

    protected abstract Class<? extends Tile> getTileClass(); 
} 

public class B extends A { 
    public static class MyTile implements A.Tile { } 

    @Override 
    protected Class<MyTile> getTileClass() { 
     return MyTile.class; 
    } 
} 

更妙的是,使一個普通的。你仍然需要使用擴展了類類型定義,但你可以更具體一點:

public abstract class A<T extends A.Tile> { 
    public static interface Tile; 

    protected abstract Class<? extends T> getTileClass(); 
} 

public class B extends A { 
    public static class MyTile implements A.Tile { } 

    @Override 
    protected Class<MyTile> getTileClass() { 
     return MyTile.class; 
    } 
} 
-1
public abstract class A { 
    public static interface Tile {}; 

    // I return something that is-a Tile 
    protected abstract Tile getTileClass(); 
} 

public class B extends A { 
    public static class MyTile implements A.Tile { } 

    @Override 
    protected abstract Tile getTileClass() { 
     return new MyTile(); 
    } 
} 

無需仿製藥,你只想說,你返回瓷磚或瓷磚子類。順便說一下,類中的公共靜態接口是「代碼味道」;要麼保護它,所以只有A的子類可以實現Tile,或者將它放在它自己的頂層接口中。放入一個,但允許任何人實施它發送混合信息。