클래스 간 계층 구조를 사용하여 사촌이 매우 비슷한 기능을 공유합니다. 예를 들어 :제한된 유형으로 캐스팅
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?의 가까운 중복 된 것으로 보인다. 내 경계에는 객체와 인터페이스가 포함되어 있기 때문에 상황이 약간 다릅니다. 다른 질문에는 인터페이스가 두 개 있지만 상황은 다릅니다.
내 전체 응용 프로그램을 다시 만들고 싶습니다. 한숨.
관리자가 자유롭게 이것을 닫을 수 있습니다., 해봐요 몇 과부하를 가지고 정확하게 우아한 아니지만
가능한 중복 http://stackoverflow.com/questions/318208/how-should-i-cast-for-java-generic-with -multiple-bounds) –