2012-06-29 83 views
1

我正在嘗試用Java編寫一個屏幕管理器 - 我是一個新手。這個類(ScreenManager)應該能夠接受一個類的類型然後實例化它。它更容易使用代碼來解釋的話,我希望能夠做到這一點:如何將Java類封裝/轉換爲父類類型?

ScreenManager manager = new ScreenManager(); 
manager.setCurrentScreen(MenuScreen.class); 
manager.runScreen(); 

MenuScreen延伸的類稱爲屏幕延伸的JFrame。我的想法是讓AScreen,BScreen,CScreen等都擴展屏幕,以便我可以將它們投射到屏幕並將它們存儲爲單一類型。

所以屏幕管理是這樣的:

import javax.swing.UIManager; 

public class ScreenManager { 

    private Class<Screen> _currentScreen; 
    private Screen _currentScreenObject; 

    public ScreenManager() { } 

    public ScreenManager(Class<Screen> screen) { 
     setCurrentScreen(screen);  
    } 

    public Class<Screen> getCurrentScreen() { 
     return _currentScreen;   
    } 

    public void setCurrentScreen(Class<Screen> screen) { 
     _currentScreen = screen; 
    } 

    public void runScreen() { 
     if (_currentScreen == null) return; 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       UIManager.put("swing.boldMetal", Boolean.FALSE);     
       try { 
        _currentScreenObject = _currentScreen.newInstance(); 
       } catch (InstantiationException | IllegalAccessException e) {     
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 

屏幕簡直是,所有AScreen,BScreen等已經是在它們的構造一些初始化代碼。

import javax.swing.JFrame; 

public class Screen extends JFrame { 

    private static final long serialVersionUID = 1L; 

} 

我上傳遞類類型的屏幕管理類絆位。

ScreenManager manager = new ScreenManager(); 
manager.setCurrentScreen(MenuScreen.class); 
manager.runScreen(); 

現在我可以投它像這樣:

Screen s = new MenuScreen(); 

但我似乎無法通過類的類型。我試着投它,像這樣:

manager.setCurrentScreen((Screen.class)MenuScreen.class); 

這是行不通的。我只是來自C#背景,所以我的觀點可能(也可能是)錯誤。如果是這樣,請糾正我。

感謝您的閱讀!

+3

爲什麼不只是manager.setCurrentScreen(new MenuScreen())? – Matsemann

+0

是的,那部分也讓我感到困惑。 Java在一個相對簡單的應用程序中很少與實際的類相提並論,而不是該類的實例。 – Marvo

+0

我的印象是我需要用'javax.swing.SwingUtilities.invokeLater'運行,看到這個:http://stackoverflow.com/questions/6567870/what-does-swingutilities-invokelater-do –

回答

4

使用Class<? extends Screen>而不是Class<Screen>。它將接受Screen.classMenuScreen.class,給定MenuScreen延伸Screen。 Java的等價於C#的泛型協方差...

+0

令人驚歎。謝謝!我在閱讀過的一些文檔中看到了這一點,但沒有注意到它是解決方案。 –

1

與C#不同,Java中的類型參數是僅編譯時功能並且不是協變的。

在Java a List<Integer>不是List<Number>

通過聲明「屏幕的某些未知子類型」,您可以聲明它爲Class<? extends Screen>。這是最好的Java可以做的,因爲它只在運行編譯器時檢查類型,而不是像C#那樣運行代碼。

+0

啊我明白了。現在有道理。類<?擴展屏幕>作品。謝謝! +1 –