如何编写一个接受任何扩展Throwable类的集合的方法?

时间:2014-01-28 15:29:51

标签: java generics

我想传递一组将Throwable扩展到方法的类。但是,我的尝试无法使用jdk1.6.0_39编译Netbeans:

package com.memex.sessionmanager;

import java.util.Collection;
import java.util.Collections;

public class GenericsDemo
{
    public void foo(Collection<Class<? extends Throwable>> c)
    {
    }

    public void bar()
    {
        foo(Collections.singleton(RuntimeException.class));
    }
}

编译器说foo(java.util.Collection<java.lang.Class<? extends java.lang.Throwable>>) in com.memex.sessionmanager.GenericsDemo cannot be applied to (java.util.Set<java.lang.Class<java.lang.RuntimeException>>)

我可以通过将调用代码更改为:

来进行编译
foo(Collections.<Class<? extends Throwable>>singleton(RuntimeException.class));

但我宁愿不强迫客户写这个钝的泛型类型。是否有可能编写一个方法,该方法将采用子类型Throwable

的任何类集合

修改

Someone使用方法签名修复了上述示例:

public <T extends Throwable> void foo(Collection<Class<T>> c) {}

但我现在遇到问题使用参数。具体来说,我想将它分配给一个字段,如下所示:

package com.memex.sessionmanager;

import java.util.Collection;
import java.util.Collections;

public class GenericsDemo
{

    private Collection<Class<? extends Throwable>> throwables;

    public <T extends Throwable> void foo(Collection<Class<T>> c)
    {
        throwables = c;
    }

    public void bar()
    {
        foo(Collections.singleton(RuntimeException.class));
    }
}

但是编译器说:

incompatible types
found   : java.util.Collection<java.lang.Class<T>>
required: java.util.Set<java.lang.Class<? extends java.lang.Throwable>>

2 个答案:

答案 0 :(得分:6)

使用

public <T extends Throwable> void foo(Collection<Class<T>> c) {}

答案 1 :(得分:3)

这应该适用于Java 7:

import java.util.Collection;
import java.util.Collections;

public class Generics {
  public void foo(Collection<? extends Class<? extends Throwable>> c) { 
  }

  {
    foo(Collections.singleton(RuntimeException.class));
  }
}