2012-06-29 2 views
1

Java로 화면 관리자를 작성하려고합니다. 새로운 언어입니다. 이 클래스 (ScreenManager)는 클래스 유형을 가져 와서 인스턴스화 할 수 있어야합니다. 너무 코드를 설명하기 쉽게, 나는이 작업을 수행 할 수 있도록하려면 :Java 클래스를 상위 클래스 유형으로 박스/캐스트하는 방법은 무엇입니까?

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

MenuScreen는 JFrame의를 확장하는 클래스라는 화면을 확장합니다. 내 생각은 AScreen, BScreen, CScreen 등 모든 Screen을 확장하여 스크린에 캐스팅하고 하나의 단일 유형으로 저장할 수 있도록하는 것입니다.

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 등이 자신의 생성자에서 일부 초기화 코드 :

그래서 ScreenManager로이 같다.

import javax.swing.JFrame; 

public class Screen extends JFrame { 

    private static final long serialVersionUID = 1L; 

} 

나는 ScreenManager로 클래스에 클래스 형을 통과에 걸림돌하고 비트.

Screen s = new MenuScreen(); 

을하지만 클래스 유형을 전달할 수없는 것 :

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

지금은과 같이 캐스팅 할 수 있습니다. 나는 그것을 이렇게 던지려고 노력했다 :

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

그것은 작동하지 않는다.

참고로 C# 배경에서 왔기 때문에 내 관점이 잘못되었을 수 있습니다. 그렇다면, 저를 시정하십시오.

지금까지 읽어 주셔서 감사합니다.

+3

왜 manager.setCurrentScreen (새 MenuScreen())이 아닌가? – Matsemann

+0

그래, 그 부분도 나 혼란 스럽다. 상대적으로 단순한 응용 프로그램에서 Java가 해당 클래스의 인스턴스가 아닌 실제 클래스를 소란스럽게 다루는 경우는 거의 없습니다. – Marvo

+0

나는 javax.swing.SwingUtilities.invokeLater'로 실행해야한다는 인상을 받았다. 이것을 보시라 : http://stackoverflow.com/questions/6567870/what-does-swingutilities-invokelater-do –

답변

4

Class<Screen> 대신 Class<? extends Screen>을 사용하십시오. 그런 다음 MenuScreenScreen 인 경우 Screen.classMenuScreen.class을 모두 허용합니다. Java의 C#의 제네릭 공분산에 대한 일종의 ...

+0

놀라운. 고맙습니다! 실제로 읽은 일부 문서에서는 이것을 보았지만 해결 방법으로는 알지 못했습니다. –

1

C#과 달리 Java의 유형 매개 변수는 컴파일 타임 전용 기능이며 공 변하지 않습니다.

Java에서 List<Integer>List<Number>이 아닙니다.

Class<? extends Screen>으로 선언하여 "화면의 알 수없는 하위 유형"을 지정할 수 있습니다. C#처럼 코드를 실행할 때가 아니라 컴파일러를 실행할 때만 유형을 검사하기 때문에 Java가 할 수있는 최선의 방법입니다.

+0

알았어. 이제는 의미가 있습니다. 클래스 이 작동합니다. 감사! +1 –

관련 문제