如何在Java泛型中表示以下类型关系:
class MyClass<T> { }
interface MyInterface<T extends MyClass> {
void m1(T<Integer> argument);
void m2(T<String> argument);
void m3(T<?> argument);
}没有编译器的抱怨。这有可能吗?我希望确保所有方法都接收相同的MyClass (子)类,同时不破坏类型安全。在域中,MyClass的不同子类不会有意义。我真的需要像这样列出三个泛型类型变量吗:
class MyClass<T> { }
interface MyInterface<T1 extends MyClass<Integer>,
T2 extends MyClass<String>, T3 extends MyClass<?>> {
void m1(T1 argument);
void m2(T2 argument);
void m3(T3 argument);
}我觉得这篇文章读起来很糟糕,而且也没有像我希望的那样很好地表达我的意图。这个问题与我关于泛型Raw types inside of generic definition的另一个问题有关,这个问题仍然让我感到困惑。也许有人能帮上忙!谢谢。
发布于 2013-06-17 16:00:29
嗯,我意识到我得到了,因为我不能用Java表达:
class MyClass<T> { }
interface MyInterface<T extends MyClass> {
T<S> m1(S argument);
}然而,我找到了一个相当奇特的解决方案。在编译之前,我使用Spoon来读写相应的源代码,而不是在每个子接口中手动升级返回类型。编译器将我的代码视为我手动重写了每个接口中的返回类型。这使我的代码与每个Maven构建上的超级界面保持同步,我不必再担心它了。
这个解决方案可能并不适合每个人,但它是我能想到的最干净的解决方案,本着DNRY的精神。
发布于 2013-06-15 01:38:52
我不确定这是不是一个好方法。我觉得使用下面的方法你不能“绑定”参数m1,m2,m3方法,相反,在调用时你可以有特权使用任何类型的参数,无论是MyClass<Integer>还是MyClass<String>
public class MyClass<T> { }
interface MyOtherClass<T extends MyClass<?>> {
void m1(T argument);
void m2(T argument);
void m3(T argument);
}和实现者
class MyOtherClassImpl<T extends MyClass<?>> implements MyOtherClass<T> {
@Override
public void m1(T argument) {
}
@Override
public void m2(T argument) {
}
@Override
public void m3(T argument) {
}
}这就是你如何调用
MyOtherClass<MyClass<?>> otc = new MyOtherClassImpl<MyClass<?>>();
MyClass<Integer> m1 = new MyClass<Integer>();
MyClass<String> m2 = new MyClass<String>();
MyClass<Object> m3 = new MyClass<Object>();
otc.m1(m1);
otc.m2(m2);
otc.m3(m3);https://stackoverflow.com/questions/17114045
复制相似问题