5

我有一个采用泛型参数类型的方法。我的场景是这个方法将被不同的参数类型调用。

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 来获取其值。现在由于方法定义是通用的,我该如何实现呢?

4

6 回答 6

8

拥有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
    }
}
于 2012-12-04T20:16:00.583 回答
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());
    }
}   
于 2012-12-04T20:15:37.520 回答
1

创建这样一个没有限制类型的泛型方法是没有意义的。由于 T 不受任何类型的限制,因此您不能在列表内的对象上使用特定接口。因此,如果您希望 testMethod 获取任何类型的对象列表,则应List<?>改为使用。

于 2012-12-04T20:12:07.040 回答
1

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

private void testMethod(List<? extends SomeInterface> list) {
    for (SomeInterface event : list) {
        // now you can use `event.getID()` here
    }
}
于 2012-12-04T22:20:54.800 回答
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
  }
}
于 2012-12-04T20:04:41.217 回答
0

我不知道我是否真的明白你想要什么。但是,如果您知道,您会将例如 Strings 存储到您的 List 中并想要使用该toUpperCase()方法,那么直接转换它怎么样?

于 2012-12-04T20:06:35.723 回答