我有一个List
定义了泛型。此列表中的所有元素都定义了接口TransferableData
。根据最终填充列表的对象,我想调用一个方法来处理数据。
所以我想存档这样的东西:
private <T extends TransferableData> String doSomething(List<T> data, Class<T> dataType){
if(returnType.equals(A.class)){
for(T singleElement : data){
((A)singleElement).methodInsideA();
}
}else if(returnType.equals(B.class)){
for(T singleElement : data){
((B)singleElement).methodInsideB();
}
}
}
我意识到这不是这样做的方法。如果没有所有if-else和未经检查的演员,我就找不到合适的方法。
答案 0 :(得分:0)
根据Mena的评论,您可以尝试这样的事情,
public interface TransferableData {
void genericInvoker();
}
public class A implements TransferableData {
@Override
public void genericInvoker() {
methodInsideA();
}
void methodInsideA(){
// Do specific thing to A
}
}
public class B implements TransferableData {
@Override
public void genericInvoker() {
methodInsideB();
}
void methodInsideB(){
// Do specific thing to B
}
}
然后您可以按如下方式调用方法:
private <T extends TransferableData> String doSomething(List<T> data, Class<T> dataType){
for(T singleElement : data){
singleElement.genericInvoker();
}
//Don't forget to return a String from this method
}
答案 1 :(得分:0)
基于您的类正在实现TransferableData
接口的假设,您可以添加一个方法invokeMethod()
,该方法具有返回类型的void。对于下面的解决方案,您应该在所有类中使用相同的方法签名。
public interface TransferableData {
void invokeMethod();
}
public class A implements TransferableData {
@Override
public void invokeMethod() {
//Your business logic A
}
}
public class B implements TransferableData {
@Override
public void invokeMethod() {
//Your business logic for B
}
}
将对象列表迭代为(无需将dataType传递给此方法):
private <T extends TransferableData> String doSomething(List<T> data) {
for(T object: data){
object.invokeMethod();
}
//return the string according to your business logic.
}