2014-03-25 39 views
0

我有一个接口和通用设置器的问题,我现在试图解决几个小时。具有接口和抽象类的Java通用设置器

我有一个接口,我想定义一些getter和setter函数。 getter函数应该由一些抽象类来实现,因为它们通常不应该改变。另一方面,setter函数应该可以被定义的类多次覆盖。在这种情况下我尝试来形容,那将是对childClass应该能够实现具有相同的名称和不同的输入2个setFunctions值

Interface TestClass {  
     public abstract void setSomething(List<?> value); 
     public abstract List<String> getSomething(); 
} 

abstract class AbstractTestClass implements TestClass { 

     List<String> someData; 

     public List<String> getSomething() { 
      return someData; 
     } 
} 

class TestClassImplementation extends AbstractTestClass() { 

     @Override 
     public void setSomething(List<String> data) { 
     someData = data; 
     } 

     @Override 
     public void setSomething(List<SomeOtherType> data) { 
     someData = convertToStringList(data); 
     } 

     private List<String> convertToStringList(List<SomeOtherType> data) { 
     ... do some conversion ... 
     return returnList; 
     } 
} 

希望这给了我想做的想法。我甚至更喜欢在抽象类中使用stringlist实现setSomething。但是这两个setter必须是可达的。 谢谢

回答

3

你根本无法做到这一点。泛型不保留在运行时(谷歌类型擦除欲了解更多信息或只是阅读wikipedia页)。

这意味着您的setSomething方法都具有相同的签名,因为它们唯一的参数类型为列表

+0

如果他自己实现一个列表,如MyList ,该怎么办?只是问问。 – gonzalon

+0

如果他们使用不同的类作为参数(例如* StringList *,* SomeOtherList *,...),他可以拥有多个setSomething方法,但泛型对此无用。 –

2

那么,你应该尝试用通用的解决方案:

Interface TestClass<T> { //Generic type T that you will provide when extending with actual class 

    public abstract void setSomething(List<T> value); 
    public abstract List<T> getSomething(); 
} 

class TestClassImplementation extends AbstractTestClass<RealType> { 

    @Override 
    public void setSomething(List<RealType> data) { 
     someData = data; 
    } 
} 

,混淆你的是,通配符标志?并不意味着它改变了什么样的事情,它只是表示未知类型。

+0

我应该提到,我第一次尝试通用的解决方案,这适用于一个setter例如我可以做任何字符串或SomeOtherType但不是通过重载两个setter。 – Xtroce