我有一些接口(和完整性两个虚拟类,所以你可以将代码复制到您的IDE)了解泛型语法 - 泛型类型实现多个接口,参数
public interface ItfA
{
String getA();
}
public interface ItfB
{
String getB();
}
public class MyClassAdapter
{
public Object getValue(Object bean)
{
return null; // override to do something useful
}
}
public class MyClass
{
public MyClass(MyClassAdapter mca)
{
// do something useful with it
}
}
而且我有一些功能使用这些作为参数(看起来有点怪异,但是这就是我必须使用他们(我不能改变MyClassAdapter
))...
public <T extends ItfA> MyClass getMyClass(final Class<T> itf)
{
return new MyClass(new MyClassAdapter()
{
@Override
public Object getValue(Object bean)
{
return itf.cast(bean).getA();
}
}
);
}
因此,我可以把这个getMyClass
只与类实现接口ItfA
- 其他人e编译器会抱怨。
或者我也可以重写此方法不指定泛型类型T作为...
public MyClass getMyClass2(final Class<? extends ItfA> itf)
{
return new MyClass(new MyClassAdapter()
{
@Override
public Object getValue(Object bean)
{
return itf.cast(bean).getA();
}
}
);
}
在某些情况下,我需要的类作为实现多个接口参数 - 这将工作:
public <T extends ItfA & ItfB> MyClass getMyOtherClass(final Class<T> itf)
{
return new MyClass(new MyClassAdapter()
{
@Override
public Object getValue(Object bean)
{
return itf.cast(bean).getA() + itf.cast(bean).getB();
}
}
);
}
但这个不起作用
public MyClass getMyOtherClass2(final Class<? extends ItfA & ItfB> itf)
{
return new MyClass(new MyClassAdapter()
{
@Override
public Object getValue(Object bean)
{
return itf.cast(bean).getA() + itf.cast(bean).getB();
}
}
);
}
我不明白的区别betw een这两种通用参数(<T extends ItfA>
之前的方法名称和使用Class<T>
中的参数与参数中使用Class<? extends ItfA>
相反) - 为什么两种类型都使用一个接口,为什么一个接口有两个接口,但另一个接口没有。
任何提示?对我来说,第二个变种更具可读性,所以我更喜欢这一点,但我不明白它与多个接口一起工作...
无法调整'MyClassAdapter'确实可以保证您可以在这里使用泛型获得的功能。无论你在* compile *时间做什么,你都被迫投射。您正在执行的演员*可能会在编译时工作,但可能会在运行时崩溃。 – Makoto
你知道所有的这些都等同于无反射'新MyClass的(新MyClassAdapter(){ @Override 公共 对象的getValue(对象豆) { 回报((ITFA)豆).getA(); } } );',对吗? –
@LouisWasserman:假设有一个''类...... –
Makoto