使用getter和java泛型方法参数

使用getter和java泛型方法参数,java,generics,type-inference,Java,Generics,Type Inference,我有一个采用泛型参数类型的方法。我的情况是,将使用不同的参数类型调用此方法 class something{ public void someMethod(){ List<A> listA = ....; //Class A have a field String Id; List<B> listB = ....; //Class B haave a field String Id; testMethod(list

我有一个采用泛型参数类型的方法。我的情况是,将使用不同的参数类型调用此方法

class something{
    public void someMethod(){
        List<A> listA = ....; //Class A have a field String Id;
        List<B> listB = ....; //Class B haave a field String Id;

        testMethod(listA);
        testMethod(listB);
    }

    private <T> void testMethod( List<T> list ){
            for( T event : list ){
                //TODO (something like): event.getId();
            }
        }
}
分类{
公共方法(){
List listA=..;//类A有一个字段字符串Id;
List listB=..;//类B有一个字段字符串Id;
试验方法(listA);
测试方法(listB);
}
私有void测试方法(列表){
对于(T事件:列表){
//TODO(类似于):event.getId();
}
}
}

在上述代码中,所有参数都将是
列表
。所有对象类型都有一个公共字段,需要使用getter获取其值。现在,由于方法定义是通用的,我如何实现这一点?

这是无法实现的。在方法中,不能以相同的方式处理两个具有不兼容接口的不同列表,除非对
instanceof
执行某些操作,即

public void testMethod(List<? extends Object> list) {
  if(list.get(0) == null) return;
  if(list.get(0) instanceof A) {
    // Do the A stuff
  } else {
    // Do the B stuff
  }
}

我不知道我是否真的理解你想要什么。
但是如果您知道,您将在列表中存储例如字符串,并希望使用
toUpperCase()
method,如何强制转换它?

创建这样一个没有绑定类型的通用方法是没有意义的。因为T没有绑定到任何类型,所以不能在列表中的对象上使用特定的接口。因此,如果您希望testMethod获取任何类型的对象列表,您应该使用
list

定义方法通过扩展公共类/接口
BaseType
,您可以这样做:

private <T extends BaseType> void testMethod( List<T> list ){
   for( T event : list ){
       //TODO (something like): event.getId();
   }
}
private void测试方法(列表){
对于(T事件:列表){
//TODO(类似于):event.getId();
}
}
例子:
public void someMethod(){
List listA=Arrays.asList(新整数[]{1,4,9});
listB=Arrays.asList(新的Double[]{1.5,4.2,9.3});;
试验方法(listA);
测试方法(listB);
}
私有void测试方法(列表){
对于(T事件:列表){
//注意:此处调用的是intValue()方法
//在被T扩展的基类编号中
System.out.println(event.intValue());
}
}   

A
B
实现一个公共接口,该接口有一个方法
getID

interface SomeInterface {
    String getID();
}
那么你可以:

private <T extends SomeInterface> void testMethod(List<T> list) {
    for (T event : list) {
        // now you can use `event.getID()` here
    }
}
private void测试方法(列表){
对于(T事件:列表){
//现在可以在这里使用'event.getID()'
}
}

正如其他答案所说,您需要通过某个接口绑定类型参数。但对于您使用它的目的,您实际上不需要使用
t

private void testMethod(List<? extends SomeInterface> list) {
    for (SomeInterface event : list) {
        // now you can use `event.getID()` here
    }
}

private void testMethod(列表由于每次都会使用不同类型的参数调用该方法多次,因此类型转换似乎不可伸缩(我觉得它不是最理想的)因为如果我用20种不同的参数类型调用,我会包含20种类型转换。这很好,正是我所期望的。这避免了其他情况下需要的多种类型转换。非常感谢。感谢您的回复,但我认为有一个公共接口可以更好地避免类型转换。@Vijay它在某些情况下工作得更好。@Vijay我很高兴在你的情况下它能起作用。
private void testMethod(List<? extends SomeInterface> list) {
    for (SomeInterface event : list) {
        // now you can use `event.getID()` here
    }
}