1

我将如何在 Java 中定义和F<T>接口(代替C#,它们将具有带有一个、两个和三个参数的函数在内部返回 void)?F<T,U>F<T,U,V>Action

当我尝试将它们创建为嵌套类型时,我收到一条错误消息“重复嵌套类型 F”,当我尝试将它们创建为顶级类型时,我必须将两者都F<T>放在F<T,U>F.java 中。

我也许可以通过将每个 F 放在单独的包中来解决这个问题,但我不喜欢这种解决方案,因为我必须定义尽可能多的包,因为我将拥有尽可能多的通用参数。

实现具有多个泛型参数等的 Tuple 类也是如此。

代码示例,不起作用:

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

问题是你不能有两个同名的接口。在编译期间不使用泛型(原始类型),因此编译器不会区分它们。

于 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 回答