首页 > 解决方案 > java函数如何通过模板或其他方式采用各种参数类型?

问题描述

我尝试实现一个适应不同Buffer类型的函数,例如ByteBuffer,IntBuffer,FloatBuffer等。伪代码如下所示

<T1, T2> boolean compareBuffer(T1 buf1, T1 buf2) {
    if(buf1.capacity() != buf2.capacity()) {
        return false;
    }
    for(int i = 0; i < buf1.capacity(); i++) {
        T2 v1 = buf1.get(i);
        T2 v2 = buf2.get(i);
        if(v1 != v2) {
            return false;
        }
    }
    return true;
}

编译器报告错误。我怎样才能以简单的方式做到这一点?

标签: javatemplatespolymorphism

解决方案


您需要了解Java 中的类型擦除

在您的情况下,编译器没有关于类型 T1 和 T2 的信息,除了它们必须是 Object 的后代,因为所有引用类型都是。因此,您只能在 compareBuffer 的主体中使用 Object 的属性和方法。

您似乎希望 T1 和 T2 实现 Buffer 接口。因此声明:

  <T1 extends Buffer, T2 extends Buffer> boolean compareBuffer(T1 buf1, T1 buf2) 

现在可以使用 Buffer 的属性和方法了。


推荐阅读