【问题标题】:Is there a way to implement a type-safe vector in Java?有没有办法在 Java 中实现类型安全的向量?
【发布时间】:2022-01-10 16:13:52
【问题描述】:

我正在尝试使用 Java 为我的编码分配实现一个向量。我想将有关向量维度的信息放入其类型中,以使我的代码更安全。

我尝试将向量表示为int[n],但以下代码无法编译。

public static int[n] createVector(int n) {
    return new int[n];
}

编译的输出:

src\Main.java:59: error: ']' expected
    public static int[n] createVector(int n) {
                      ^
src\Main.java:59: error: ';' expected
    public static int[n] createVector(int n) {
                       ^
src\Main.java:59: error: invalid method declaration; return type required
    public static int[n] createVector(int n) {
                         ^
3 errors

我认为问题在于java中所有的int数组都具有相同的类型,我无法对其进行专门化。

有没有办法在 Java 中做到这一点?

【问题讨论】:

  • 不,在任何情况下都不能专门化 Java 数组。使用一个类。
  • 另外,泛型不支持值,只支持类型。
  • 它不是公共类型信息的一部分,但Java数组 fixed length
  • 解释编译器错误:您不能将数组的 size 指定为其类型的一部分。 IE。 int[n] 不是有效的 return 类型; int[]。当您初始化一个数组时,您指定它的大小(所以return new int[n] 很好,因为您正在创建一个)。
  • 这段代码无法编译我并不感到惊讶。函数结果类型中的 int[n] 是什么?它必须是 int[]

标签: java vector types


【解决方案1】:

如果你想让向量 [a,b] 的类型 != 向量 [a,b,c] 的类型,你可以这样写:

class Vector<T> {
  private final int dimension;
  private T[] elements;

  public Vector(Class<T> clazz, int dimension) {
    this.dimension = dimension;
    this.elements = (T[]) Array.newInstance(clazz, dimension);
  }
}

class Vector2D<T> extends Vector<T> {
  public Vector2D(Class<T> clazz) {
      super(clazz, 2);
  }
}

class Vector3D<T> extends Vector<T> {
  public Vector3D(Class<T> clazz) {
    super(clazz, 3);
  }
}

【讨论】:

  • 是个好主意,但是在这个实现中,我需要为每个N写一个VectorND,我想要一个通用的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 2013-08-22
  • 2014-11-24
  • 2013-10-12
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多