2

我有以下接口

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();
}

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

例如,应该可以添加两个环元素,但不能添加一个群元素和一个环元素。

我的第一个想法是使用 < ? super 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();
}

那会是一个解决方案吗?

4

3 回答 3

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>
于 2012-12-12T21:22:06.003 回答
1

也许你想使用这样的接口:

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

然后如果你愿意,你可以在你的函数中使用 instanceof 吗?

于 2012-12-12T14:30:19.193 回答
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()操作。

如果你想强制只有包含在组/环中的元素可以在操作中使用,你的实现应该检查参数是否在组/环中,如果不是则抛出异常。类型系统不是为此而设计的,因为这是基于值的检查,而不是类型检查。

于 2012-12-12T14:36:21.683 回答