Java Generics - 难以强制执行强类型检查

1 java generics strong-typing

这是我的代码:

public class Sequence<T> {

    protected List<T> sequence = new ArrayList<T>();

    public Matrix<OrderedPair<T, ?>> createCartesianProduct(Sequence<?> secondSequence) {
        Matrix<OrderedPair<T, ?>> result = new Matrix<OrderedPair<T, ?>>();
        for (int rowIndex = 0; rowIndex < sequence.size(); rowIndex++) {
            Sequence<OrderedPair<T, ?>> row = new Sequence<OrderedPair<T, ?>>();
            for (int columnIndex = 0; columnIndex < secondSequence.length(); columnIndex++) {
                row.add(new OrderedPair(sequence.get(rowIndex), secondSequence.sequence.get(columnIndex)));
            }
        }
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

这在Eclipse中编译,但是在内部for循环(row.add(...))内的行上我得到以下三个警告:

  • OrderedPair是一种原始类型.OrderedPair()<T1, T2>应参数化对泛型类型的引用.
  • 类型安全:OrderedPair类型的表达式需要未经检查的转换才能符合 OrderedPair<T, ?>
  • 类型安全:构造函数OrderedPair(Object,Object)属于原始类型OrderedPair.<T1, T2>应参数化对泛型类型OrderedPair的引用

我想使用泛型来强制执行强类型检查,但我想我对泛型的理解不足以让我看到如何.有人可以教育我吗?

谢谢,

- 肯

Mic*_*ers 9

内部for循环中的构造函数应该具有泛型:

row.add(new OrderedPair <T, ?> (sequence.get(rowIndex), secondSequence.sequence.get(columnIndex)));

但你不能这样使用?; 所以你需要?用字母替换所有的s,比方说E.然后<E>在签名中添加一个,如下所示:

public <E> Matrix<OrderedPair<T, E>> createCartesianProduct(Sequence<E> secondSequence) {

否则,编译器将不知道它E来自何处.