我正在尝试实现一种算法,该算法需要根据(任何给定的)枚举类型定义的排序来比较某些元素,因此我尝试使用模板定义中的枚举来专门化它。我尝试使用简单的代码来查看我的想法是否可行,但我无法编译。关于如何处理问题的任何想法。这是我的代码:
public class Algorithm <T extends Enum<T> >{
public TLCAlgorithm(){
T t1;
T t2;
if (t1<t2){
//do something
}
}
基本上t1
和t2
将是其他地方定义的枚举类型的不同值。我计划使用不同的枚举类型来定义不同类型的排序,因此通过使用不同的枚举类型实例化类,算法的行为应该不同。我将实例化为:Algorithm<Ordering1> alg1=new Algorithm<Ordering1>()
。
答案 0 :(得分:4)
由于你称之为“模板”,我猜你是来自C ++背景。您应该知道Java泛型与C ++模板的工作方式完全不同,尽管语法相似:泛型方法不能专门用于不同类型,如函数模板。相同的编译字节码用于所有类型的数据。
在Java中为类型提供自定义排序的常用方法是实现Comparator接口。例如,要为类Foo
提供多个排序,您需要编写几个全部实现Comparator<Foo>
的类,并在每个类中定义compare(Foo, Foo)
方法。您的算法可以采用类型为Comparator<Foo>
的参数,调用者可以传递其中一个实现的实例。
您还可以在Comparator
中实施enum
,并为每个枚举值分别实施compare
:
public enum Ordering implements Comparator<Person> {
BY_NAME {
@Override
public int compare(Person a, Person b) {
// Compare people's names...
}
},
BY_AGE {
@Override
public int compare(Person a, Person b) {
// Compare people's ages...
}
}
}
public class Example {
public void algorithm(Comparator<Person> comparator) {
Person a = // ...
Person b = // ...
if (comparator.compare(a, b) > 0) {
// ...
}
}
public void caller() {
algorithm(Ordering.BY_NAME); // Run algorithm using name ordering
algorithm(Ordering.BY_AGE); // Run algorithm using age ordering
}
}
答案 1 :(得分:0)
请更改正确的构造函数名称。
public Algorithm()
使用序数方法。它将给出enum的订单号。
Returns the ordinal of this enumeration constant (its position in its enum declaration, where the initial constant is assigned an ordinal of zero). Most programmers will have no use for this method. It is designed for use by sophisticated enum-based data structures, such as java.util.EnumSet and java.util.EnumMap.
if (t1.ordinal()<t2.ordinal()){
使用这样的条件。