gpt4 book ai didi

java - 访问泛型类型的静态字段

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:57:56 27 4
gpt4 key购买 nike

我能否要求实现接口(interface)的类具有某个静态字段或方法,并通过泛型类型参数访问/调用该字段或方法?

我有一个接口(interface),Arithmetical ,它指定了几个函数,例如 T plus(T o)T times(T o)。我还有一个 Vector > 类,它适用于具有 N 类型组件的 vector (可变维度)。然而,我在尝试实现 dot product 时遇到了一个问题。 .

我想实现方法N dot(Vector o) 。为此,我计划从 N 的零开始,并遍历两个 Vector s' List s ,将每对元素的乘积加到我的总数中。有没有办法在 Arithmetical 中指定所有实现类必须有一个静态(最好是最终)字段 ZERO 并开始 dot(Vector o) 的主体部分类似于 N sum = N.ZERO;?

如果不是,还有什么其他方法可以解决这个问题?我想允许 0 维 vector ,所以我不能从乘以 vector 的第一个分量开始。有没有办法实例化一个泛型类型的对象,所以我只能在 Arithmetical 中指定一个 T zero() 方法?

我不使用 Java 的数值类型是有原因的——我想要具有复杂分量的 vector 。

这是算术:

public interface Arithmetical<T> {
public T plus(T o);
public T minus(T o);
public T negate();
public T times(T o);
public T over(T o);
public T inverse();
// Can I put a line here that requires class Complex (below) to define ZERO?
}

vector :

public class Vector<N extends Arithmetical<N>> {

private List<N> components;
public Vector<N>(List<N> cs) {
this.components = new ArrayList<N>(cs);
}

public N dot(Vector<N> o) {
// Here's where I need help.
}

}

和复杂:

public class Complex implements Arithmetical<Complex> {

public static final Complex ZERO = new Complex(0, 0); // Can I access this value through N if <N extends Arithmetical<N>>?

private double real;
private double imag;
public Complex(double r, double i) {
this.real = r;
this.imag = i;
}

/* Implementation of Arithmetical<Complex> (and some more stuff) not shown... */

}

我对 Java 很陌生(和一般编程);我可能不会理解复杂的 (ha) 解释和解决方法。

谢谢!

(建议使用 Python 标记... Huh. )

最佳答案

每个可能的实现类型都需要一个“零”。接口(interface)中的常量是不行的,因为常量不能被覆盖并且必须保持不变。

解决方案是在你的 Arithmetical 接口(interface)中添加一个新方法:

public T zero();

每个实现都被迫实现这一点并返回自己的零版本。在这种情况下,您将使用它作为添加的起点;这是加法身份。

Complex 类实现如下所示。

@Override
public Complex zero() {
return ZERO;
}

如果您的实例是可变的,则不要使用常量;只需返回 new Complex(0, 0)

另一个想法是借用 Streamreduce-ing 项并将它们组合成一个项时所做的事情——取一个表示初始状态的标识值,即尚未收集任何项目 - 零。

public N dot(Vector<N> o, N identity) {
N dotProduct = identity;
// Perform operations on each item in your collection
// to accumulate and return a dot product.
}

调用者必须提供标识值。

Complex dotProduct = vectorOfComplex.dotProduct(otherVector, new Complex(0, 0));

关于java - 访问泛型类型的静态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49287566/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com