【发布时间】:2013-03-06 15:09:18
【问题描述】:
我在理解以下场景时遇到了一些麻烦。 我有一个由抽象类和扩展抽象类的具体类实现的“通用”接口。
问题是抽象类中返回参数化列表的所有方法都丢失了它们的类型,所以我收到一个编译错误,告诉我它无法从对象转换为原始 List 类型。
谁能提供一些见解?
最后,我希望在抽象类上有一个 getId 和 setId 方法,其返回类型为 java.lang.object 或 <T extends Object>,具体类将其返回类型实现为任何他们想要的类型。
这是我的不同对象的代码:
通用接口
public interface MyInterface<T>{
public T getId();
public void setId(T id);
}
实现接口的抽象类
public abstract class MyAbstractClass<T> implements MyInterface<T>{
private List<String> texts;
private List<Integer> notes;
public List<String> getTexts(){
return texts;
}
public List<Integer> getNotes(){
return notes;
}
}
实现抽象类的具体类
public class MyConcreteClass implements MyAbstractClass<Integer>{
private Integer id;
public Integer getId(){
return this.id;
}
public void setId(Integer id){
this.id = id;
}
}
其他类:
public class SomeOtherClass{
public void process(List<T extends MyAbstractClass> myClassList){
// Compilation error ->
// Type mismatch: cannot convert from element type Object to String
for(MyAbstractClass myObj : myClassList){
System.out.println("object Id : " + myObj.getId());
// Compilation error ->
// Type mismatch: cannot convert from element type Object to String
for(String txt : myObj.getTexts()){
}
}
}
}
【问题讨论】:
-
您可能需要
public void process(MyAbstractClass<Integer> myClass){。请注意将添加到参数类型。 -
是的,但问题是我希望能够处理我的抽象类的所有子类型,以便在 for 循环中调用 getId() 方法。我刚刚编辑了代码以更好地展示我正在尝试的内容
标签: java generics type-erasure