- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我能否要求实现接口(interface)的类具有某个静态字段或方法,并通过泛型类型参数访问/调用该字段或方法?
我有一个接口(interface),Arithmetical
,它指定了几个函数,例如 T plus(T o)
和 T times(T o)
。我还有一个 Vector
类,它适用于具有 N
类型组件的 vector (可变维度)。然而,我在尝试实现 dot product 时遇到了一个问题。 .
我想实现方法N dot(Vector
。为此,我计划从 N
的零开始,并遍历两个 Vector
s' List
s ,将每对元素的乘积加到我的总数中。有没有办法在 Arithmetical
中指定所有实现类必须有一个静态(最好是最终)字段 ZERO
并开始 dot(Vector
的主体部分类似于 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)
。
另一个想法是借用 Stream
在 reduce
-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/
我是一名优秀的程序员,十分优秀!