我有一个接口和通用设置器的问题,我试图解决几个小时了。
我有一个界面,我想定义一些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必须是可达的。 感谢
答案 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;
}
}
让您感到困惑的是,通配符符号?
并不意味着它会更改任何类型,它只表示未知类型。