1

JavaでインターフェイスとF<T>インターフェイスを定義するにはどうすればよいですか( C# の代わりに、内部で void を返す 1 つ、2 つ、3 つのパラメーターを持つ関数を使用します)。F<T,U>F<T,U,V>Action

ネストされた型として作成しようとすると、「ネストされた型 F が重複しています」というエラーが表示されます。最上位の型として作成しようとするF<T>F<T,U>、F.java に と の両方を配置する必要があります。

I might be able to solve this by placing each F in separate package, but I don't like that solution as I'd have to define as many packages as many generic parameters I would have.

The same would go for implementing a Tuple class with multiple generic parameters, etc.

code sample, not working:

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

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

4 に答える 4

3

同じインターフェース名ではできません。Java はパラメータ化された型を消去します。

他のツールキットは、F1<T>、F2<T1, T2>、F3<T1, T2, T3> などの名前を使用して同様のことを行っています。もう少し冗長ですが、機能します。

于 2013-02-10T18:44:23.620 に答える
1

F と F の両方を F.java に配置する必要があります。

Fは次のように定義されているためpublic(省略可能)

また、同じ名前の複数のインターフェイスも避けてください。そうする正当な理由は決してありません!

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!");
   }
}
于 2013-02-10T18:40:06.677 に答える
1

問題は、同じ名前の 2 つのインターフェースを持つことができないことです。ジェネリック (生の型) はコンパイル時に使用されないため、コンパイラはそれらを区別しません。

于 2013-02-10T18:43:17.243 に答える
1

Java では、ジェネリック型には一定数の型パラメーターがあります。したがって、異なる数のパラメーターが必要な場合は、異なるタイプが必要です。

interface F1<T> {
    void f(T arg);
}

interface F2<T, U> {
    void f(T t, U u);
}

等々。

于 2013-02-10T18:47:05.853 に答える