2012-05-24 46 views
7

看起来这是不可能的,但有没有人有一个聪明的方法解决这个问题?强制通用类型为接口?

public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S> 

S应该是和SomeClass一些未知类型的接口是2D阵列具有行索引,在功能上与双向JDBC结果相似。 SomeClass的子类对每列都有自定义的getter和setter。我希望能够遍历这个结构,就像我会List一样。我想在我的SomeClass和Bean之间实现一个通用接口来访问getter和setter。因此S需要成为那个界面。但是我提供的声明不起作用。有没有办法解决这个问题?

编辑展示我期望的实现:

public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S>{ 

T object; 

public SomeClassWrapper(T object){ 
    this.object = object; 
} 

@Override 
public Iterator<S> iterator() { 
    object.setIndex(-1); 
    return new SomeClassIterator<S>(); 
} 

private class SomeClassIterator<S> implements Iterator<S> { 

    @Override 
    public boolean hasNext() { 
     return object.index() < object.rowSize() - 1; 
    } 

    @Override 
    public S next() { 
     object.next(); 
     //safe because only interface methods allowed, can't further manipulate index 
     return object; 
    } 

    @Override 
    public void remove() { 
     object.deleteRow(); 
    } 
} 
+2

是什么意思? Java不支持多重继承。你想保证T扩展SomeClass并实现S? –

+0

就像它在描述中所说的那样,S是一个接口 –

+1

@LudwigMagnusson,无论'X'是类还是接口,只能在泛型类型参数定义中使用'extends X'。 –

回答

0

你不能参数SomeClassS?然后,你可以有

public class SomeClassIterableWrapper<S, T extends SomeClass<S>> 
     implements Iterable<S>{ 
+0

我正在考虑参数化SomeClass作为一个完全不同的解决方案。 SomeClass会自己实现Iterable。但是我不想使用这个解决方案,因为SomeClass在现有的代码库中使用了很多。 –

+0

您也可以考虑使用组合而不是继承,所以您现有的子类可以保存对“SomeClass”的引用,并进行参数化。 – artbristol

-1

我承认,我不完全理解的问题,但是这是我的建议: 创建的S的接口。它包含一个方法ad,它返回S对象。

public interface SWrapper<S> { 

    S getS(); 

} 

然后创建一个实现:

public class SImpl implements SWrapper<SImpl> { 

    @Override 
    public SImpl getS() { 
     return this; 
    } 

} 

您现在可以创建:

public class SomeClass<T extends SomeClass & SWrapper<T>> { 

    private final T object; 

    public SomeClass(T object) { 
     this.object = object; 
    } 
} 

你将不得不修改使用了一点,但也许它的工作原理。

0

我认为在S伸展SomeClass的&小号

公共类SomeClassIterableWrapper

必须是一个明确的类,因为在这种情况下, S有可被扩展东西类。

有没有一种方法可以缩小 代替S所用的潜在类? 如果您有多个T应扩展的 类,则可以使用多个&符号

+0

是的,这正确地确定了问题。不幸的是,S所描述的接口数量并不是可以缩小的,事实上只会随着时间的推移而增长。 –