2013-02-10 2 views
1

Java에서 F<T>F<T,U>F<T,U,V> 인터페이스를 정의하는 방법 (C#의 Action 대신 하나, 둘, 셋 매개 변수가있는 함수를 사용하여 void를 반환 함)?F <T> 및 F <T,U> 및 F <T,U,V> 인터페이스를 Java로 정의하는 방법은 무엇입니까?

중첩 형식으로 만들려고하면 "중첩 형식 F 중복"이라는 오류가 발생합니다. 최상위 형식으로 만들려고하면 F<T>F<T,U>을 모두 F에 넣어야합니다. 자바.

각 F를 별도의 패키지에 배치하여이 문제를 해결할 수는 있지만 많은 일반 패키지만큼 많은 패키지를 정의해야하므로이 솔루션이 마음에 들지 않습니다.

작동하지 않는 등

코드 샘플, 여러 제네릭 매개 변수로 튜플 클래스를 구현하기위한 갈 것 같은 :

public interface F<T>{ 
    public void f(T arg1); 
} 

public interface F<T,U>{ 
    public void f(T arg1,U arg2); 
} 
+1

오류 코드를 공유 할 수 있습니까? 나는 당신이하려는 것을 이해하기가 어렵다. –

+0

메서드 수준에서 제네릭 형식을 대신 정의 하시겠습니까? – assylias

+0

@DuncanJones - 편집 된 게시물 – Axarydax

답변

3

동일한 인터페이스 이름으로는 작업 할 수 없습니다. Java는 매개 변수화 된 유형을 지 웁니다.

다른 툴킷 F1 <T> 같은 이름을 사용하여 비슷한했을, F2 < T1, T2 및 F3 > < T1, T2, T3 >. 조금 더 장황하지만 작동합니다.

1

내가 F에서 F와 F 모두 배치 할 것 .자바. Fpublic가 정의된다 (이 ommited 가능)

때문에

또한 같은 이름을 가진 다중 인터페이스를 피한다. 그렇게할만한 이유가 없습니다!

interface F<T,U,V>{ 
    public void f(T arg1); 
    public void f(T arg1, U arg2, V arg3); 
    public void f(T arg1, U arg2); 
} 

public class TryTest<T,U,V> implements F<T,U,V>{ 
    public void f(T arg1, U arg2){ } 
    public void f(T arg1) { } 
    public void f(T arg1, U arg2, V arg3) { } 
    public static void main(String[] args) { 
     System.out.println("Works!"); 
    } 
} 
+1

의 "함수 포인터"로 사용하고 싶습니다.이 인터페이스를 사용하고 싶을 때마다 이러한 모든 방법을 구현할 수 있습니다. 어떤 액션을 넘기기위한 인터페이스를 구현하는 것은 C# lambda 메소드에 비해 너무 번거롭지만 매번 3 개 이상의 메소드를 구현해야하는 번거 로움이 너무 많습니다 : ( – Axarydax

+0

IDE를 사용하면 IDE가 자동으로 당신은'implements'을 선언합니다 :-). Java는 C#과 같은 generics의 기본 매개 변수화를 허용하지 않습니다. C#은 훨씬 고급 언어입니다. –

+0

저는 Eclipse에 대해 알고 있습니다. Eclipse에 대해 크게 감사하고 있습니다. C#에서 1 줄을 사용하는 것은 Java에서 5를 사용합니다. 그러나 Java가 람다를 도입 할 때까지는 우리가 살 필요가 있습니다. – Axarydax

1

동일한 이름의 인터페이스를 두 개 가질 수 없다는 것이 문제입니다. 제네릭 (원시 형식)은 컴파일 타임에 사용되지 않으므로 컴파일러는이를 차별화하지 않습니다.

1

Java에서 제네릭 형식은 고정 된 수의 매개 변수를가집니다. 따라서 다른 수의 매개 변수가 필요한 경우 다른 유형이 필요합니다.

등등.

관련 문제