Java接口和抽象类的通用设置器

时间:2014-03-25 15:15:35

标签: java generics

我有一个接口和通用设置器的问题,我试图解决几个小时了。

我有一个界面,我想定义一些getter和setter函数。 getter函数应该由一些抽象类实现,因为它们通常不应该改变。 另一方面,setter函数应该可以被定义的类多次重写。在我尝试描述的情况下,childClass应该能够实现具有相同名称和不同输入值的2个setFunction

 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必须是可达的。 感谢

2 个答案:

答案 0 :(得分:3)

你根本无法做到这一点。泛型不会在运行时保留(google type erasure 以获取更多信息,或者只需阅读wikipedia页面)。

这意味着您的setSomething-methods都具有相同的签名,因为它们的唯一参数是 List 类型。

答案 1 :(得分: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;
    }
}

让您感到困惑的是,通配符符号?并不意味着它会更改任何类型,它只表示未知类型。