2014-10-23 8 views
1

IStructuredSelection으로 프로젝트를 선택한 경우 .toArray()를 사용하여 Object [] - 내용을 가져온 다음 각 Object를 IAdaptable로 캐스팅 한 다음 다시 IXavaProject로 캐스팅하면 문제가 해결되고 모든 작업이 완료됩니다. 메소드/클래스와 인터페이스 ...Eclipse 플러그인 - 캐스트 대신 어댑터를 사용하면 어떤 이점이 있습니까?

대신 (IJavaProject) adaptable.getAdapter (IJavaProject.class)를 사용하면 일부 인터페이스 메소드가 손실됩니까?

어댑터가 정확히 무엇을합니까 ("주어진 클래스 매개 변수의 인스턴스 인 객체를 반환합니다 ..."). 왜 모든 사람들이 캐스트 대신 그것을 사용하도록 권장합니까? 여기에 관련 코드 당신이 IProject 또는 IJavaProject 대신 그들은 코드가보기 또는 편집기를 제시하고자하는 방법에 더 적합 일부 내부 클래스입니다 같은 것들을 구현하지 않는 선택에서 얻을

IAdaptable adaptable = (IAdaptable) selectedObject; 
    IJavaProject javaProject = (IJavaProject) adaptable.getAdapter(IJavaProject.class); 
    final IProject iProject = javaProject.getProject(); 
    iProject.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); 
    final IJavaProject javaRefreshedProject = JavaCore.create(iProject); 
    //processing further using ASTParser and CompilationUnit 

답변

2

많은 객체입니다.

선택 개체가 원하는 인터페이스를 구현하지 않기 때문에이 경우 캐스팅을 사용할 수 없습니다.

object.getAdapter(...)을 사용하여 기본 클래스를 검색 할 수있는 IAdaptable을 사용자 인터페이스 개체에 구현할 수 있습니다.

그러나 모든 객체 대신 그들은 기본 개체에 대한 UI 개체에서 변환 완전히 다른 클래스를 선언 할 IAdapterManagerregisterAdapters 방법을 사용, IAdaptable 자체를 구현하지.

public static <AdapterType> AdapterType adapt(Object adaptableObject, Class<AdapterType> adapterType) 
{ 
    if (adaptableObject == null) 
    return null; 

    // Is the object the desired type? 

    if (adapterType.isInstance(adaptableObject)) 
    return adapterType.cast(adaptableObject); 

    // Does object adapt to the type? 

    if (adaptableObject instanceof IAdaptable) 
    { 
    AdapterType result = adapterType.cast(((IAdaptable)adaptableObject).getAdapter(adapterType)); 
    if (result != null) 
     return result; 
    } 

    // Try the platform adapter manager 

    return adapterType.cast(Platform.getAdapterManager().getAdapter(adaptableObject, adapterType)); 
} 
+0

감사합니다 빠른 회신 :이 경우

IProject project = (IProject)Platform.getAdapterManager().getAdapter(object, IProject.class); 

당신은 모든 가능성에 대처하기 위해 다음과 같이 유틸리티 방법을 사용할 수 있습니다 사용합니다. 불행히도 플랫폼 어댑터를 이미 사용해 보았습니다. UI 선택없이 작업 공간 (루트)에서 직접 IProject를 가져 오려고했습니다. 그러나 UI 선택의 내용에 대한 간단한 캐스트가 가장 잘 작동하는 이유는 무엇입니까? 정보가 손실되는 위치를 찾으려고 노력할 것입니다. 하지만 디버깅하는 동안 그런 딥 변수를 분석하는 데는 많은 시간이 필요합니다. – Phil

+0

'IWorkspaceRoot'를 사용하면'IWorkspaceRoot.getProjects()'를 호출 할 수 있습니다.하지만 이는 어댑터와 관련이 없습니다. 'IWorkspaceRoot'는 JDT 개념 인'IJavaProject'에 대해 아무것도 모릅니다. –

+0

하지만 iproject의 isNatureEnabled를 확인하고 JavaCore.create (project)를 사용하면 JDT-IJavaProject가 될 수 있습니다. 하지만 내가 말했듯이,이 방법은 어떤 이유로 든 나를 위해 작동하지 않는다 ... 나는 CompilationUnit 방문자가 어댑터가 아니라 여기에 잘못이 있다고 생각한다 ... – Phil

관련 문제