我有以下界面
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();
}
这会是一个解决方案吗?
答案 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是否在组/环中,如果不是则抛出异常。类型系统不旨在执行此操作,因为这是基于值的检查,而不是类型检查。