2012-02-19 3 views
1

클래스 간 계층 구조를 사용하여 사촌이 매우 비슷한 기능을 공유합니다. 예를 들어 :제한된 유형으로 캐스팅

Node 
    Statement 
    FunctionCallStatement 
    Expression 
    FunctionCallExpression 

FunctionCallStatement 및 FunctionCallExpression 매우 비슷한 API를 공유하지만 단일 상속 계층 순수 수준의 측면에서 그 표현 수 없습니다. 그래서, 저는이 두 가지가 구현 한 IsFunctionCall 인터페이스를 만들었습니다. 이 모두가 매우 잘 작동

void <T extends Node & IsFunctionCall> doSomething(T node) { ... } 

: 지금 다음과 같이 FunctionCallStatement 또는 FunctionCallExpression 중 하나를 취하는 방법을 선언 할 수 있습니다.

불행히도, 나는 이제 다소 어색한 문제에 직면하게되었습니다. 노드가 있습니다. 나는 이되어야 FunctionCallStatement 또는 FunctionCallExpression이어야한다는 것을 동적으로 알고있다. 노드를 위의 doSomething() 메서드에 전달해야합니다. 나는 그것을 적절한 유형으로 추방하는 길을 찾을 수 없습니다.

지금 instanceof의 체인을 사용하여 Node 클래스를 결정하고 적절한 구체 유형으로 캐스팅합니다.하지만 엉덩이가 엉망입니다. 이 작업을하기 위해 알고있는 유일한 다른 방법은 IsNode 인터페이스를 만들고 현재 노드가 IsNode를 기대한다고 기대하는 모든 것을 갖도록하는 것입니다. 이렇게하면 IsNode 및 IsFunctionCall을 구현하는 공용체 인터페이스를 선언 할 수있게되고 위의 일반 사항 없이는 처리 할 수있게됩니다. 그러나 그것은 많은 일의 지옥이고 아직도 꽤 못생긴 것입니다.

다른 방법이 있습니까?

(참고 :. 위의 예 내 실제 코드의 단순화 된 버전) 업데이트

: 다음

@SuppressWarnings("unchecked") 
private <S extends Node & IsFunctionCall> S castNode(Node node) 
{ 
    return (S) node; 
} 

과 :

doSomething(castNode(node)); 
나는 악마의 다음 조각을 시도

일부 매우 이상한 오류 메시지가 있습니다. castNode()의 S를 결정하는 데 사용 된 유형 유추가 doSomething()의 T 선언과 일치하지 않는 것으로 보입니다. 구체적인 유형 만 사용하고 S를 노드로 설정합니다. 물론 doSomething()의 선언 된 유형과 일치하지 않습니다. 매우 특이한.

업데이트 업데이트 :

How should I cast for Java generic with multiple bounds?의 가까운 중복 된 것으로 보인다. 내 경계에는 객체와 인터페이스가 포함되어 있기 때문에 상황이 약간 다릅니다. 다른 질문에는 인터페이스가 두 개 있지만 상황은 다릅니다.

내 전체 응용 프로그램을 다시 만들고 싶습니다. 한숨.

관리자가 자유롭게 이것을 닫을 수 있습니다., 해봐요 몇 과부하를 가지고 정확하게 우아한 아니지만

+0

가능한 중복 http://stackoverflow.com/questions/318208/how-should-i-cast-for-java-generic-with -multiple-bounds) –

답변

0

나는이 밖으로 방법을 생각 : 당신은, 플래그 기능에 대한 인터페이스를 사용하는

void doSomething(FunctionCallStatement node) ... 
void doSomething(FunctionCallExpression node) ... 
0

을하는 방법에 인수로 참조를 전달하는 방법에 대한 함수 호출 추상화에 대한 액세스를 제공하는 FunctionCallInterface?

doSomething은 관련 정보에 액세스하고 구현 객체의 관련 메소드를 호출 할 수있는 한 실제 구현 유형을 알 필요가 없습니다.

public class FunctionCallStatement extends Statement implements FunctionCallInterface { 
} 

void doSomething(FunctionCallInterface node) { 
} 
[I 여러 경계를 가지는 일반적인 자바 캐스트하는 방법?] (의
+0

'doSomething()'은 FunctionCallInterface 기능뿐만 아니라 Node 기능에 액세스해야하기 때문에 일반적인 유형의 이유입니다. 두 노드가 같은 객체가 될지라도 Node *와 * FunctionCallInterface를 전달할 수 있다고 가정합니다. –

+0

@David Given, Node가 구현하는 'NodeInterface'를 정의하고 'FunctionCallInterface' 그것을 확장하여 필요한 모든 기능을 제공하십시오. – rsp

관련 문제