带有类型参数的抽象方法的强制转换参数



我不知道是否完全可以做到这一点,但它就在这里。

我有一个抽象类。我们称之为类"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(),需要TA的第一个类型参数:

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) {
}
}
}
}

最新更新