使用getter和java泛型方法参数

时间:2012-12-04 20:02:14

标签: 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(listA);
        testMethod(listB);
    }

    private <T> void testMethod( List<T> list ){
            for( T event : list ){
                //TODO (something like): event.getId();
            }
        }
}

在上面的代码中,所有参数都是List<someObjectType>。所有对象类型都有一个公共字段,需要使用getter来获取其值。既然方法定义是通用的,我该如何实现呢?

6 个答案:

答案 0 :(得分:7)

AB实现一个具有方法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
    }
}

答案 1 :(得分:1)

这不可能。除非您使用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
  }
}

答案 2 :(得分:1)

创建没有有界类型的通用方法毫无意义。由于T不受任何类型的限制,因此您无法在列表中的对象上使用特定接口。因此,如果您希望testMethod获取任何类型的对象列表,则应使用List<?>代替。

答案 3 :(得分:1)

使用T扩展您的公共类/接口BaseType来定义您的方法:

private <T extends BaseType> void testMethod( List<T> list ){
   for( T event : list ){
       //TODO (something like): event.getId();
   }
}

实施例

public void someMethod() {
    List<Integer> listA = Arrays.asList( new Integer[] {1, 4, 9} );
    List<Double> listB = Arrays.asList( new Double[] {1.5, 4.2, 9.3} );;
    testMethod(listA);
    testMethod(listB);
}

private <T extends Number> void testMethod( List<T> list ){
    for( T event : list ) {
        // Note intValue() method is being called here which is provided
        // in the base class Number that is being extended by T
        System.out.println(event.intValue());
    }
}   

答案 4 :(得分:1)

正如其他答案所说,你需要通过某个接口绑定type参数。但是对于您正在使用它的内容,您实际上并不需要T

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

答案 5 :(得分:0)

我不知道我是否真的明白你想要什么。 但是如果你知道的话,你会将Strings存储到你的List中并希望使用toUpperCase()方法,那么只需将它投射出来?