我有一个这样的课程
class Dummy{
public getData(Info info){
List<SomeType> list = info.getDataAsPerInfo();
List<SomeType> result=new List<>();
for(SomeType someType: list){
// extracting data from someType, lets say this data is
// resType (it also of SomeType)
result.add(resType);
}
}
public static void main(String args[]){
Info1 info = new Info1(); // Info1 extends Info
// adding paramters to info
new Dummy().getData(info);
}
}
现在问题是我有几个Info类,如Info1, Info2 ...
并且getData方法可能会返回不同类型的列表。我不知道如何在不重写每个Info类的代码的情况下实现这一目标(这将涉及用该类的返回类型替换SomeType
&getdataAsPerInfo函数)。
有没有一种方法可以根据传递给getData函数的Info类型以某种方式使用SomeType
?在这种情况下,最好的方法是什么?谢谢 !!
答案 0 :(得分:2)
请查看Generics的Oracle教程。
您不仅可以将一个特定类定义为列表元素的类型,还可以定义实现特定接口的类或类的系列。
编辑以纳入评论。
当Info.getDataAsPerInfo()
根据使用的InfoX类返回不同对象的列表时,这将是通用接口的用例。
public interface Info<T> {
List<T> getDataAsPerInfo();
}
实现如:
public class Info1 implements Info<SomeType>
或
public class Info2 implements Info<SomeOtherType>
然后你的Dummy
- 类看起来像
class Dummy {
public getData(Info<T> info) {
List<T> list = info.getDataAsPerInfo();
List<T> result=new List<>();
for(T someType: list){
// extracting data from someType, lets say this data is
// resType (it also of SomeType)
result.add(resType);
}
}
public static void main(String args[]){
Info1 info = new Info1(); // Info1 extends Info<SomeType>
// adding paramters to info
new Dummy().getData(info);
}
}
答案 1 :(得分:1)
如果每个类的信息是不同类型但是扩展或实现主超类型,则可以使用List&lt; ?扩展类型&gt;哪个会起作用
你总是可以使用List&lt; ? &GT;它返回任何值作为泛型,它基本上是一个未知的对象,所以只需要getData返回List&lt; ? &GT;它应该工作正常,然后检查他们用“instanceof”或其他方式进行输入,这应该适用于你想要实现的目标。
或者对于您正在使用的方法(看起来像),您可以使用T设置,这里是我认为您想要实现的代码片段。
public <T> List<T> getInfo(T type) {
// T here would be the type
return new ArrayList<T>();
}
你的问题有点含糊不清,所以如果你能解释一下你想要做的更多,那么我可以提供更多的帮助。
答案 2 :(得分:1)
我认为你不需要在这里摆弄仿制药。您正在寻找一种解决方案,您可以在运行时(多态)决定SomeType的功能。看看这个解决方案。
private interface SomeType {
void doAThing();
}
private class AnotherType implements SomeType {
@Override
public void doAThing() {
System.out.println("AnotherType.doAThing");
}
}
private class OneMoreType implements SomeType {
@Override
public void doAThing() {
System.out.println("OneMoreType.doAThing");
}
}
private abstract class Info {
public abstract SomeType getDataAsPerInfo();
}
private class Info1 extends Info {
@Override
public SomeType getDataAsPerInfo() {
return new AnotherType();
}
}
private class Info2 extends Info {
@Override
public SomeType getDataAsPerInfo() {
return new OneMoreType();
}
}
现在您可以从Info返回SomeType并专门实现子类中的功能。