Java 对派生类的泛型对象调用基方法
尝试使用方法添加基接口,以便所有派生类都必须实现该方法或使用默认方法。让此方法可调用的最佳方法是什么?请参阅下面代码块中的注释Java 对派生类的泛型对象调用基方法,java,class,generics,multiple-inheritance,Java,Class,Generics,Multiple Inheritance,尝试使用方法添加基接口,以便所有派生类都必须实现该方法或使用默认方法。让此方法可调用的最佳方法是什么?请参阅下面代码块中的注释 public interface IA{} public interface IB{ public Integer doWork(); } public interface IC extends IB{ } class B implements IB{ Integer doWork(){ return 2; } } cla
public interface IA{}
public interface IB{
public Integer doWork();
}
public interface IC extends IB{
}
class B implements IB{
Integer doWork(){
return 2;
}
}
class C extends B implements IC{
@Override
Integer doWork(){
return 7;
}
}
//What do I need to do to cast clazz to an object so I can call the derived class' doWork method?
private Integer newClient(Class<T> clazz){
((B) clazz).doWork();
}
公共接口IA{}
公共接口IB{
公共整数doWork();
}
公共接口IC扩展IB{
}
类实现IB{
整数doWork(){
返回2;
}
}
类C扩展了B实现了IC{
@凌驾
整数doWork(){
返回7;
}
}
//我需要做什么才能将clazz强制转换为对象,以便调用派生类的doWork方法?
私有整数新客户端(clazz类){
(B)clazz.doWork();
}
至于如何确保调用重写基的派生类方法,这是Java的本机行为
示例程序:
public class Foo {
static class A {
int get() { return 0; }
}
static class B extends A {
@Override
int get() { return 1; }
}
public static void main(final String[] args)
{
A a = new A();
B b1 = new B();
A b2 = new B();
printA(a);
printA(b1);
printA(b2);
}
public static <T extends A> void printA(T bObj) {
System.out.println(bObj.get());
}
}
请注意,从b2::get()::int返回的输出与b1::get()::int相同,即使b2是类型A,b1是类型B。这是因为,即使我们在b2中只有对A类的引用,对象实现仍然是B。您似乎只想知道如何实例化该类。假设它有一个默认构造函数,您可以这样做:
private Integer newClient(Class<B> clazz){
try {
((B) (clazz.getConstructor().newInstance())).doWork();
} catch ...
}
private Integer新客户端(clazz类){
试一试{
((B)(clazz.getConstructor().newInstance()).doWork();
}抓住。。。
}
最终找到了解决方案:
B.class.cast(clazz);
我正在研究如何使它在类似代码块中最后一个方法的情况下可调用。我知道覆盖批注。你已经在做了。如果传入的类是C类型,则可以将clazz强制转换为B类型的类(尽管如果您不想将类的类型限制为扩展B或实现IB的类,我会添加一个instanceof check),那么调用将调用C类的函数实现,即使您只将其强制转换为B类型的类。很抱歉,我忽略了@Powerlord指出的内容。我已经编辑了我的回复,以包括您应该做什么的示例。A是一个类描述符,而不是所述类的
对象。
B.class.cast(clazz);