寻求 java 泛型方法的帮助
seek for help on java generic method
我有以下 class 结构,
abstract class AbstractA {...}
class A1 extends AbstractA {...}
class A2 extends AbstractA {...}
abstract class AbstractB<T extends AbstractA> {
public void handle(T a) { ... }
}
class B1 extends AbstractB<A1> {
public void handle(A1 a) {
super.handle(a);
...
}
}
class B2 extends AbstractB<A2> {
public void handle(A2 a) {
super.handle(a);
...
}
}
现在我想实现一个通用方法,它将 AbstractB 列表和相关的 AbstractA 作为参数。例如
Handler.<B1, A1>handle(listOfB1, A1);
Handler.<B2, A2>handle(listOfB2, A2);
和
Handler.<B1, A2>handle(listOfB1, A2);
Handler.<B2, A1>handle(listOfB2, A1);
不允许。
我试过了
class Handler {
// public static <T extends AbstractB<K extends AbstractA>, K extends AbstractA> handle(List<T> list, K a) {
public static <T extends AbstractB<? extends AbstractA>, K extends AbstractA> handle(List<T> list, K a) {
for (T tmp : list) {
tmp.handle(a);
}
}
}
但两者都不编译。任何人都可以帮助并给我任何线索吗?谢谢!
将其更改为:
public static <T extends AbstractB<K>, K extends AbstractA> void handle(List<T> list, K a) {
for (T tmp : list) {
tmp.handle(a);
}
}
请注意,您的方法缺少 return 类型(我假设您打算使用 void return 类型)。
但是,主要问题是 T
的类型绑定应该是 extends AbstractB<K>
而不是 extends AbstractB<? extends AbstractA>
。
考虑一下您当前定义的静态句柄方法中发生了什么。
静态方法的当前签名允许此调用:
List<B1> listOfB1;
Handler.<B1, A2>handle(listOfB1, A2);
但是在静态方法的主体中,您不能将 A2
实例传递给 B1
实例的句柄方法,这就是您的代码无法通过编译的原因。因此 T 的类型界限必须依赖于 K.
我有以下 class 结构,
abstract class AbstractA {...}
class A1 extends AbstractA {...}
class A2 extends AbstractA {...}
abstract class AbstractB<T extends AbstractA> {
public void handle(T a) { ... }
}
class B1 extends AbstractB<A1> {
public void handle(A1 a) {
super.handle(a);
...
}
}
class B2 extends AbstractB<A2> {
public void handle(A2 a) {
super.handle(a);
...
}
}
现在我想实现一个通用方法,它将 AbstractB 列表和相关的 AbstractA 作为参数。例如
Handler.<B1, A1>handle(listOfB1, A1);
Handler.<B2, A2>handle(listOfB2, A2);
和
Handler.<B1, A2>handle(listOfB1, A2);
Handler.<B2, A1>handle(listOfB2, A1);
不允许。
我试过了
class Handler {
// public static <T extends AbstractB<K extends AbstractA>, K extends AbstractA> handle(List<T> list, K a) {
public static <T extends AbstractB<? extends AbstractA>, K extends AbstractA> handle(List<T> list, K a) {
for (T tmp : list) {
tmp.handle(a);
}
}
}
但两者都不编译。任何人都可以帮助并给我任何线索吗?谢谢!
将其更改为:
public static <T extends AbstractB<K>, K extends AbstractA> void handle(List<T> list, K a) {
for (T tmp : list) {
tmp.handle(a);
}
}
请注意,您的方法缺少 return 类型(我假设您打算使用 void return 类型)。
但是,主要问题是 T
的类型绑定应该是 extends AbstractB<K>
而不是 extends AbstractB<? extends AbstractA>
。
考虑一下您当前定义的静态句柄方法中发生了什么。 静态方法的当前签名允许此调用:
List<B1> listOfB1;
Handler.<B1, A2>handle(listOfB1, A2);
但是在静态方法的主体中,您不能将 A2
实例传递给 B1
实例的句柄方法,这就是您的代码无法通过编译的原因。因此 T 的类型界限必须依赖于 K.