2

我正在尝试用 Java 编写一个泛型类。该类中的一些方法需要T extends Comparable<T>. 我怎样才能使它T只有在使用其中一种方法时才需要具有可比性?或者也许还有其他方式我应该组织我的课程?

这是我要实现的类。我计划在可比较和不可比较类型上使用它和数组。

// I know Java has its own containers, but this
// is homework and I'm not allowed to use them
class Array<T>
{
    // Some methods that pose no
    // special restrictions on T

    // These require that T be comparable
    public Array<T> union(...) {...}
    public Array<T> intersect(...) {...}
}
4

3 回答 3

3

您可以隐藏T方法的类型。Tof和这里Test的 of 不一样。TCompareMethod

public static class Test<T> {
    <T extends Comparable<T>> void compareMethod(T t, Class<T> classt) {
    }
    void normalMethod(T t) {
    }
}

现在的例子

    Test<String> test = new Test<String>();//Comparable class
    test.compareMethod("",String.class);//works fine
    Test<Random> tes1t = new Test<Random>();//Non Comparable class
    tes1t.compareMethod(new Random(),Random.class);//Compilation error here 
    tes1t.normalMethod(new Random());//Works fine
    new Test<Random>().compareMethod("",String.class);// Not a good but can be valid
new Test<String>().compareMethod(new Random(),Random.class);//Compilation error here

更新:

在被这个解决方案诅咒之后,我在 java API 中进行了一些搜索,并且这种做法得到了toArray()遵循

ArrayList<String> string = new ArrayList<String>();
string.toArray(new Integer[5]);<--Illegal however <T> is hide by toArray method
于 2012-10-27T12:34:06.660 回答
2

编辑:看起来这毕竟是可能的(见 AmitD 的帖子)。但无论如何,其他可能的解决方案是

  1. 将需要可比较的方法重构为子类
  2. 只需在相关方法中使用强制转换,这意味着该部分只会在运行时检查。
于 2012-10-27T12:32:45.210 回答
1

通过常规方法(例如使用可比性)是不可能的。

如果您分享确切的要求会更好。

如果在 ArrayList/Arrays 中排序是您的目标,那么比较不可比较的类是没有用的。排序只能在相同或子类型的对象中进行。

但是,如果您要使用 compare 来检查对象是否相等,那么我建议您覆盖 equals(Object O) 方法。

于 2012-10-27T12:41:25.887 回答