【发布时间】:2020-07-27 12:02:36
【问题描述】:
我有两个实现接口的类
public class MyClassA implements IClassA {
// code
}
public class MyClassB implements IClassB {
// code
}
我有转换这些类的实用函数
public class Util {
public static List<MyClassB> convertAtoB(List<MyClassA> aClasses) {
// logic
}
}
最后,我有一个泛型类
public class GenericClass <D extends IClassA, V extends IClassB> {
public List<V> someFunc(List<D> in) {
return Util.convertAtoB(in); // ERROR HERE
}
}
错误来了
Required Type: List<MyClassA>
Provided: List<D>
出了什么问题?
编辑
这是我想要实现的目标
我有许多转换器函数,它们使用某种逻辑将一种类型的列表转换为另一种类型。函数如下所示,在 Util 类中
List<B> convertAtoB(List<A> list) { }
List<C> convertBtoC(List<B> list) { }
List<D> convertCtoD(List<C> list) { }
List<E> convertDtoE(List<D> list) { }
... so on
现在,所有这些都必须异步调用。因此,我将为此目的使用 AyncTask。现在我有两个选择:
选项 1: 创建多个类,每个类都扩展 AsyncTask 并在每个类中调用各自的转换器函数。
class ConvertAtoBAsync extends AsyncTask<List<MyClassA>, Void, List<MyClassB>> {
public List<MyClassB> doInBackground(List<MyClassA> ...lists) {
return convertAtoB(lists[0]);
}
}
class ConvertBtoCAsync extends AsyncTask<List<MyClassB>, Void, List<MyClassC>> {
public List<MyClassC> doInBackground(List<MyClassB> ...lists) {
return convertBtoC(lists[0]);
}
}
.. so on
选项 2:创建一个通用 AsyncTask 类,该类可以根据类类型调用特定类型的转换器
public class ConvertAsync <D extends IClassIn, V extends IClassOut> {
ConvertAsync(Class _class) { mClass = _class }
public List<V> someFunc(List<D> in) {
if(mClass = MyClassA.class)
return Util.convertAtoB(in); // ERROR HERE
else if(mClass = MyClassB.class)
return Util.convertBtoC(in); // ERROR HERE
.. so on
}
}
我不能使用 Option-2 实现吗?
【问题讨论】:
-
好吧,你给了错误的参数,编译器对此很不高兴。不知道你为什么会认为未绑定的泛型类型参数
D和MyClassA是一样的? -
DIS-AIClassA和MyClassAIS-AIClassA,但这并不意味着您可以在需要MyClassA的地方传递D。IClassA可以有许多其他实现。 -
@Kayaman 有一个额外的代码可以知道类型。如果类型是 MyClassA,那么上面的代码会被调用,否则会被调用,等等。这不能做吗?
-
你需要解释你想要达到的目标。
-
是的,显然这样做是不安全的,但如果您相信正在使用正确的转换器,您可以转换列表。