例如,在C#中,Foo
,Foo<T>
,Foo<T1, T2>
可能具有相似的语义,但却是不同的类。但是在Java中,我无法命名那样的类。如何命名?我不认为Foo
,Foo1<T>
,Foo2<T1, T2>
是合适的。还有其他建议吗?
实际上,我想设计一些只有一个方法的接口,就像Runnable
一样。但run
中的Runnable
没有返回值和任何参数。我想要像
public interface Runnable<T>{
void run(T t);
}
public interface Runnable<T, TResult>{
TResult run(T t);
}
public interface Runnable<T1, T2, TResult>{
TResult run(T1 t1, T2 t2);
}
等等。我认为它们在同一个包装中更好。
答案 0 :(得分:3)
您可以重命名它们以真正反映其功能:
BasicFoo
GenericFoo<T>
SuperDuperAdvancedFoo<T, U>
你甚至可以声明一个接口,比如Foo,它提供了Foo应该拥有的所有方法。然后在不同的Foos中使用不同的类型参数实现接口:
interface Foo<T, U>
BasicFoo implements Foo<Object, Object>
GenericFoo<T> implements Foo<T, Object>
SuperDuperAdvancedFoo<T, U> implements Foo<T, U>
编辑:在您的示例中工作,3个接口实际上只能使用其中一个声明:
public interface Runnable<T1, T2, TResult>{
TResult run(T1 t1, T2 t2);
}
如果您不想要任何参数,只需在必要时提供Void。 Void类是不可实现的,因此唯一的另一种可能性是传递或返回null。例如:
public class MyRunnable implements Runnable<Void, Void, Void>;
创建一个类似于
的方法void run();
你实际宣布了
Void run(Void a, Void b);
但是Void是不可实现的,所以你必须传递空值,函数将始终返回null。
答案 1 :(得分:1)
这是一些函数式编程库中的一个问题,它们具有不同arity函数的类。
guava仅通过支持单个参数来避免此问题 - 如果您想要多个args,则使用包装器。由于番石榴似乎对这么多,我怀疑这是最好的答案:不要这样做。
但是functional java使用F1,F2,...所以如果你走这条路,你就不会孤单。 bolts类似,但fun4j通过使用没有泛型的varags来避免此问题。
我知道我的回复可能看起来很狂热,但番石榴人花了很多时间worrying关于如何以适当的方式将东西融入java中;我打赌他们考虑并放弃了编号方法。