在Java中定义具有相同名称但不同数量类型参数的通用接口

6
在Java(1.7)中,是否可以定义具有相同名称但具有不同数量类型参数的多个接口?我实际上正在寻找的是与.NET的Func<TResult>Func<T1,TResult>Func<T1,T2,TResult>Func<T...,TResult>委托类型在精神上类似的东西。非常类似于可选类型参数
Java语言中是否存在这样的功能,还是我只能创建不同名称的接口,例如Func0<TResult>Func1<T1,TResult>Func2<T1,T2,TResult>

如果可能的话,声明F<A>F<A,B>相比于声明F1<A>F2<A,B>有什么优势呢?它们本来就是两种不同的类型。只有在您可以声明函数的方法具有获取类拥有的所有类型参数的魔法类型签名时才有意义。这归结于缺少元组类型... - Holger
我刚刚也在做同样的事情,遇到了同样的问题!我讨厌Java中的匿名函数 - 本应只需要一行代码的东西却要写8行,但有时还是必须这么做。 - JonnyRaa
@JonnyLeeds:至少Java 8终于有了Lambda表达式。 - knittl
是的,我认为EE版本还没有发布。此外,我认为他们仍然保持着有关最终变量的奇怪规则,这意味着你需要在任何地方使用数组/字段。 - JonnyRaa
2个回答

3

泛型是一种编译时的特性,这意味着在运行时,您的Func类将全部是相同的类。即使您单独编译它们并将它们添加到类路径中,也只会加载一个类。这意味着它们必须具有不同的完整类名才能在运行时使用。


所以基本上可以归结为“由于Java的类型擦除,根本不可能吗?” - knittl
不是我所知道的,通常通过提供所有类型(例如Func<T1, T2, T3, T4, TResult>)并为两个输入提供Func <T1,T2,?,?,TResult> 来处理此类情况。在Java 8中使用类型推断可以隐藏大部分这种丑陋的代码。 - Peter Lawrey

1
你不能拥有可变数量的泛型类型参数,但是你可以通过使用 Void 类型来“强制”忽略一个参数:
interface Func<T1, T2, IReault> {...}
interface Func1<T1, IResult> extends Func<T1, Void, IResult> {...}
interface Func0<IResult> extends Func<Void, Void, IResult> {...}

"Void不能被实例化,因此您可以传递/返回/使用的唯一有效Void引用是null,从而强制要求在实现和调用者中有效地忽略Void参数。

Func1Func0的实例仍然是Func的实例。"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接