1

私はJavaでスクリーンマネージャーを書こうとしています - 私が慣れていない言語です。このクラス (ScreenManager) は、クラス タイプを取得してインスタンス化できる必要があります。コードで説明する方が簡単なので、これができるようになりたいです:

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

MenuScreen は、JFrame を拡張する Screen というクラスを拡張します。私の考えは、AScreen、BScreen、CScreen などをすべて Screen に拡張して、それらを Screen にキャストし、1 つの型として保存できるようにすることです。

したがって、ScreenManager は次のようになります。

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();
                }
            }
        });
    }
}

Screen は単純で、AScreen、BScreen などはすべて、コンストラクターの初期化コードです。

import javax.swing.JFrame;

public class Screen extends JFrame {

    private static final long serialVersionUID = 1L;

}

私がつまずいているのは、クラスタイプを ScreenManager クラスに渡すことです。

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

これで、次のようにキャストできます。

Screen s = new MenuScreen();

しかし、クラス型を渡すことができないようです。私はそれを次のようにキャストしようとしました:

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

それはうまくいきません。

参考までに、私は C# のバックグラウンドを持っているので、私の見方は間違っている可能性があります (おそらく間違っています)。もしそうなら、私を修正してください。

ここまで読んでくれてありがとう!

4

2 に答える 2

4

Class<? extends Screen>の代わりに使用しClass<Screen>ます。次に、 extendsを指定するScreen.classと、 と の両方を受け入れます。C#のジェネリック共分散に対するJavaの同等性の並べ替え...MenuScreen.classMenuScreenScreen

于 2012-06-29T21:07:18.833 に答える
1

C# とは異なり、Java の型パラメーターはコンパイル時のみの機能であり、共変ではありません。

Java では、 aList<Integer>は ではありませんList<Number>

として宣言することで、「Screen の未知のサブタイプ」を指定できますClass<? extends Screen>。これは、C# のようにコードを実行するときではなく、コンパイラを実行するときにのみ型をチェックするため、Java ができる最善の方法です。

于 2012-06-29T21:07:31.553 に答える