这个Java代码处理泛型有什么问题? 接口可添加{ 公共E添加(E x); 公共教育小组(E-y); 公共E零(); } 类SumSet实现了Set{ 私人电子元件; 公共集(E元素){ this.element=元素; } 公共E getSum(){ 返回元素.add(element.zero()); } }
似乎这个Java代码处理泛型有什么问题? 接口可添加{ 公共E添加(E x); 公共教育小组(E-y); 公共E零(); } 类SumSet实现了Set{ 私人电子元件; 公共集(E元素){ this.element=元素; } 公共E getSum(){ 返回元素.add(element.zero()); } },java,generics,Java,Generics,似乎element.add()并没有返回E extends Addable,而是返回一个对象。为什么呢?这与Java在运行时不知道对象类型是什么有关吗,所以它只是假设它们是对象(因此需要强制转换) 谢谢应该是: interface Addable<E> { public E add(E x); public E sub(E y); public E zero(); } class SumSet<E extends Addable> impleme
element.add()
并没有返回E extends Addable
,而是返回一个对象。为什么呢?这与Java在运行时不知道对象类型是什么有关吗,所以它只是假设它们是对象(因此需要强制转换)
谢谢应该是:
interface Addable<E> {
public E add(E x);
public E sub(E y);
public E zero();
}
class SumSet<E extends Addable> implements Set<E> {
private E element;
public SumSet(E element) {
this.element = element;
}
public E getSum() {
return element.add(element.zero());
}
}
效果也不错。试试:
class SumSet<T extends Addable<T>> implements Set<T> {
private T element;
public SumSet(T element) {
this.element = element;
}
public T getSum() {
return element.add(element.zero());
}
}
显然,对象
不是E
,因此存在错误。请参阅Java泛型常见问题解答
另一方面,接口定义中的方法不需要使用public
。您需要说
,而不是
这是因为当使用原始类型时,对其(不存在)类型参数的所有引用都会被擦除。
< P>而不是创建实现<代码> SET的<代码> SUSESET < /代码>类,您可能会想通过编写一个可以对集合中所有元素进行求和的方法来考虑是否可以获得所需的信息。
interface Addable {
Object add(Object x);
Object sub(Object y);
Object zero();
}
公共静态T和(集合)
{
T和=零;
用于(T:集)
{
如果(总和=null)
{
总和=t;
}
其他的
{
总和=总和加(t);
}
}
回报金额;
}
+1用于发布可轻松剪切和粘贴以进行测试的代码段。再次键入擦除@吞食:Java不知道运行时泛型是什么,所以它只是忽略它们。这偶尔会导致像这样有趣的bug。另一方面,public
对于公共接口定义中的方法是不必要的。
class SumSet<E extends Addable<E>> implements Set<E> {
interface Addable {
Object add(Object x);
Object sub(Object y);
Object zero();
}
public static <T extends Addable<T> > T sum(Set<T> set)
{
T sum = null;
for (T t : set)
{
if (sum == null)
{
sum = t;
}
else
{
sum = sum.add(t);
}
}
return sum;
}