Java中的通用接口

时间:2012-12-12 14:18:58

标签: java generics interface

我有以下界面

public interface Group {
    public Group add(Group g);
    public Group sub(Group g);
    public Group getAddInv();
    public boolean isZero();
}

public interface Ring extends Group {
    public Ring mul(Ring r);
    public boolean isOne();
}

我现在想要使这些接口通用,以确保只能为相同代数结构的元素调用方法。

例如,应该可以添加两个Ring元素,但不能添加一个Group of Element和一个Ring元素。

我的第一个想法是使用< ?超级戒指>对于Group的方法,但是没有成功。我怎样才能做到这一点?

更新

public interface Group<T> {
    public T add(T g);
    public T sub(T g);
    public T getAddInv();
    public boolean isZero();
}

public interface Ring<T> extends Group<Ring<T>> {
    public T mul(T r);
    public boolean isOne();
}

这会是一个解决方案吗?

3 个答案:

答案 0 :(得分:4)

应该是这样的:

public interface Group<T> {
    public T add(T g);
    public T sub(T g);
    public T getAddInv();
    public boolean isZero();
}

public interface Ring<T> extends Group<T> {
    public T mul(T r);
    public boolean isOne();
}

实际实现将使用自身的类型参数实现这些接口:

class MyInteger implements Ring<MyInteger>

答案 1 :(得分:1)

也许你想使用这样的界面:

public interface Test<T> {
    public void add(T t);
}

如果你想要,你可以在函数中使用instanceof吗?

答案 2 :(得分:1)

我不会尝试通过类型系统来做到这一点。首先,正如一些评论已经提到的那样,界面看起来很奇怪(将一个组添加到另一个组是什么意思?)。 相反,我会专注于通常在一个群体上完成的事情,这将是这个

interface Group<T>{
  T add(T e1, T e2);  //adds two elements of the group and returns the result
  //sub is not a group operation, there is normally only one op
  ...
}

Ring的相同内容,但添加了mul()操作。

如果要强制只允许组/环中包含的元素可用于操作,则实现应检查args是否在组/环中,如果不是则抛出异常。类型系统旨在执行此操作,因为这是基于值的检查,而不是类型检查。

相关问题