我想传递一个扩展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));
}
}
Run Code Online (Sandbox Code Playgroud)
编译说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));
Run Code Online (Sandbox Code Playgroud)
但我宁愿不强迫客户写这个钝的泛型类型.是否有可能编写一个方法,它将采用哪种类的子类型Throwable?
编辑:
有人用方法签名修复了上面的例子:
public <T extends Throwable> void foo(Collection<Class<T>> c) {}
Run Code Online (Sandbox Code Playgroud)
但是我现在在使用参数时遇到了问题.具体来说,我想将它分配给一个字段,如下所示:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
但是编译器说:
incompatible types
found : java.util.Collection<java.lang.Class<T>>
required: java.util.Set<java.lang.Class<? extends java.lang.Throwable>>
Run Code Online (Sandbox Code Playgroud)
使用
public <T extends Throwable> void foo(Collection<Class<T>> c) {}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
769 次 |
| 最近记录: |