我不知道是否完全可以做到这一点,但它就在这里。
我有一个抽象类。我们称之为类"A"。它看起来像这样:
public abstract class A <E, T>
它还具有以下抽象方法。
public abstract Object getEntityId(E entity);
因此,只要我实现抽象的 getEntityId 方法,我就可以创建更多扩展 A 类的类。例如,一个名为"ExtendedA"的类。
但我还有一个中学班,叫B班。它不是抽象的,是这样的:
public class B<T>
(请注意类型参数(
B 有一个类型 A 的字段,它应该是 A 的扩展类(例如扩展 A(。它还包含一个 T 列表,如下所示:
private A<?,?> myA;
private List<T> myList;
在某些时候,我需要为 myList 中的每个元素调用类 B 中的抽象 getEntityId 方法,但我无法完全正确获取强制转换。我觉得我错过了一些非常基本的东西。
for (T t : myList) {
if (myA.getEntityId(t)!=null) {//does not compile and I can't grasp how should I cast it.
}
}
提前谢谢。
如果你的B
类看起来像这样:
public class B<T> {
private A<?,?> myA;
void someMethod() {
for (T t : myList) {
if (myA.getEntityId(t)!=null) {
}
}
}
}
那么可以肯定的是,它不会编译:getEntityId
的参数是?
,并且您正在尝试T
传递它。?
的意思不是"任何类型",而是意味着"一种特定的类型,只是我不知道的类型"。
要将T
传递给getEntityId()
,需要T
A
的第一个类型参数:
private A<T,?> myA;
为了使代码正常工作,使其成为一个完整的 getter 方法,而不是尝试在运行时设置值,因为在通配符上执行此操作是完全非法的。要么传递引用私有 A myA 或私有 A<(一些已知的引用(,?> myA 或从 myA.getEntityId(t( 中删除参数
在调用方法 getEntityId(( 之前,还要声明一个匿名类并实现该方法
public class B<T>{
private A<T,?> myA;
private List<T> myList;
public void anycall(){
for (T t : myList) {
if (myA.getEntityId(t)!=null) {
}
}
}
}