2013-02-10 142 views
1

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

当我尝试将它们创建为嵌套类型时,出现错误说“重复的嵌套类型F”,当我尝试将它们创建为顶级类型时,我必须将F<T>F<T,U>都放置在F. java的。

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

同样会去实现多种泛型参数的元组类等

代码示例,不工作:

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

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

你能分享一个给出错误的代码的例子吗?我发现很难理解你想要做什么。 – 2013-02-10 18:28:21

+0

难道你不想在方法级别定义泛型类型吗? – assylias 2013-02-10 18:29:34

+0

@DuncanJones @DuncanJones - 看到编辑过的文章 – Axarydax 2013-02-10 18:30:31

回答

3

你不能用相同的接口名称来做它。 Java会擦除参数化类型。

其他工具包的使用像F1 <牛逼>名做过类似的事情,F2 < T1,T2 >和F3 < T1,T2,T3 >。这有点冗长,但有效。

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!"); 
    } 
} 
+1

它会工作,但每当我想使用这个接口,我会实施所有这些方法。与C#lambda方法相比,实现一个接口来传递某些动作已经太麻烦了,但是每次都必须实现3个或更多的方法将会太多: – Axarydax 2013-02-10 18:41:54

+0

如果使用IDE,IDE会自动为您插入它们你声明'implements' :-)。 Java只是不允许像C#那样的泛型的默认参数化。 C#是一种更先进的语言。 – 2013-02-10 18:43:02

+0

我意识到这一点,并非常感谢Eclipse这样做,我只是讨厌在C#中需要1行的东西需要5个Java中的这个。但是,直到Java引入lambda表达式之前,我们必须为之而活。 – Axarydax 2013-02-10 18:48:06

1

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

1

在Java中,泛型类型具有固定数量的类型参数。因此,如果您需要不同数量的参数,则需要不同类型:

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

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

等等。

相关问题