我即将创建一个工厂,它创建某种类型的对象T,它扩展了某个类A和另一个接口I.但是,T必须是未知的.以下是最低声明:
public class A { }
public interface I { }
Run Code Online (Sandbox Code Playgroud)
这是工厂方法:
public class F {
public static <T extends A & I> T newThing() { /*...*/ }
}
Run Code Online (Sandbox Code Playgroud)
这编译所有罚款.
当我尝试使用该方法时,以下工作正常:
A $a = F.newThing();
Run Code Online (Sandbox Code Playgroud)
......虽然这不是:
I $i = F.newThing();
Run Code Online (Sandbox Code Playgroud)
编译器抱怨:
绑定不匹配:类型F的泛型方法newThing()不适用于arguments().推断的类型I和A不是有界参数的有效替代
我不明白为什么.明确指出"newThing返回某种类型的东西T,它确实扩展了A类并实现了接口I".当分配给一个一切正常(因为T延伸的),但分配给我并没有(因为什么?,清楚地返回的东西是既是一个和一个I)
另外:当返回一个对象时,比如说类型B class B extends A implements I
,我需要将它转换为返回类型T,尽管B匹配边界:
<T extends A & I> T newThing() {
return (T) new B();
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器不会抛出任何警告,如UncheckedCast等.
因此我的问题:
-
编辑:这里完整的代码片段完全使用Eclipse 3.7,项目设置为JDK 6: …
看起来这是不可能做到的,但有没有人能够巧妙地解决这个问题呢?
public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S>
Run Code Online (Sandbox Code Playgroud)
哪里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 …
Run Code Online (Sandbox Code Playgroud) 我有两个接口 ( IfaceA
, IfaceB
) 和两个实现这些接口的类 (class C
, class D
):
interface IfaceA {
void doA();
}
interface IFaceB {
void doB();
}
class C implements IfaceA, IFaceB {
public void doA() {}
public void doB() {}
}
class D implements IfaceA, IFaceB {
public void doA() {}
public void doB() {}
}
Run Code Online (Sandbox Code Playgroud)
我无法更改这些类的签名。
如何制作实现两个接口的类的实例列表或集合?
我试过的:
public static void main(String[] args) {
List<? extends IfaceA & IFaceB> test_1;
List<? extends IfaceA, IFaceB> test_2;
Class<? extends IfaceA, IFaceB>[] test_3; …
Run Code Online (Sandbox Code Playgroud) 我想做这样的事情:
private Class<? extends Enum<?> implements IMultiBlockEnum> typeEnum;
Run Code Online (Sandbox Code Playgroud)
我该怎么办?"&"而不是"implements"不起作用,但Eclipse也没有给出正确的解释.
克里斯托弗克林格