2012-05-23 28 views
3

如果你有一个基类,是一个jar文件,看起来动态覆盖超类的功能,如:如何使用泛型

public class A { 

public void awesome(int i){ 

} 

} 

...这是由这些类(也是在一个罐子里)作为扩展如下:

public class A1 extends A { 

@Override 
public void awesome(int i){ 

} 

} 

public class A2 extends A { 

@Override 
public void awesome(int i){ 

} 

} 

...它可以覆盖基本功能的一种通用的方式?

说有,目前正在通过匿名内部类中添加一个实现 - 你可以的代码,使得整个匿名内部实现仅出现一次? 因此,而不是:

public class Test { 

public static void main(String args[]){ 

    A1 mySpecialA1 = new A1(){ 
     @Override 
     public void awesome(int i){ 
      //awesome implementation 
     } 
    }; 

    A2 mySpecialA2 = new A2(){ 
     @Override 
     public void awesome(int i){ 
      //awesome implementation 
     } 
    }; 
} 

} 

...你可以有(这是它打破了):

public class SpecialAFactory { 

public static <T extends A> getSpecialA(){ 
    return new T(){ 
     @Override 
     public void awesome(int i){ 
      //only once 
     } 
    }; 
} 

} 

所以,最后你会被传入子类,你想获得一个新的匿名实例。

+0

不,这是不可能的仿制药。你永远不能用'新T'因为不知道具体的类有问题的编译器无法知道你的意思是它的构造函数 - 或者哪个超你的意思是(编译器必须生成类的类文件,即使是匿名)。而且我想我只给了你很多原因之一,为什么这不可能奏效。 –

+0

@MarkoTopolnik谢谢,这就是我的想法。现在我想知道是否有一些Java功夫使用反射等方式来实现这一点,但我想这是另一个问题。 – hooby3dfx

+0

我认为它可以使用javassist之类的动态代理库。动态库动态地为你提供的任何类的子类,并且你提供了对所有情况执行的单个实现。 –

回答

2

尽管不能与泛型这样做,有一个简单,易于理解,解决方案,让您避免在这样的情况下,重复代码:

public class Test { 

public static void main(String args[]){ 

    A1 mySpecialA1 = new A1(){ 
     @Override 
     public void awesome(int i){ 
      awesomeImplementation(i); 
     } 
    }; 

    A2 mySpecialA2 = new A2(){ 
     @Override 
     public void awesome(int i){ 
      awesomeImplementation(i); 
     } 
    }; 
} 

private static void awesomeImplementation(int i) { 
    //awesome implementation 
} 

} 
+0

这是相当不错的,但如果签名被修改为'私有静态无效awesomeImplementation(INT I,A一)'和'awesomeImplementation(我这)'那么它应该更好地工作。 – emory

+0

@emory你是正确的,'awesomeImplementation'不会有'this'或在其范围'main'的当地人,这样一个需要根据需要通过他们。 – dasblinkenlight

+1

如果'awesomeImplementation'需要从'A'或其子类访问或修改受保护的成员,则不起作用。 –