是否可以在命名的通用类型上强加上限(超级X)?

时间:2011-06-04 10:47:24

标签: java generics wildcard super

假设我有以下静态方法和接口(List是java.util.List)。请注意,静态方法对列表的通配符类型强制执行“super Foo”。

public class StaticMethod {
   public static void doSomething(List<? super Foo> fooList) {
      ...
   }
}

public interface MyInterface<T> {
   public void aMethod(List<T> aList);
}

我希望能够使用静态方法添加一个实现接口的类,如下所示:

public class MyClass<T> implements MyInterface<T> {
   public void aMethod(List<T> aList) {
     StaticMethod.doSomething(aList);
   }
}

这显然不会编译,因为T没有“super Foo”约束。但是,我看不到任何添加“超级Foo”约束的方法。例如 - 以下内容不合法:

public class MyClass<T super Foo> implements MyInterface<T> {
   public void aMethod(List<T> aList) {
     StaticMethod.doSomething(aList);
   }
}

有没有办法解决这个问题 - 最好不要改变StaticMethodMyInterface

2 个答案:

答案 0 :(得分:1)

我在这里走出困境,但我认为下限是这里的问题,因为当你引用它时你必须知道适合绑定的实际类...你不能使用继承

这是一个编译的用法,但请注意我需要命名一个超级Foo的实际类:

class SomeOtherClass
{
}

class Foo extends SomeOtherClass
{
}

class StaticMethod
{
    public static <T> void doSomething(List<? super Foo> fooList)
    {
    }
}

interface MyInterface<T>
{
    public void aMethod(List<T> aList);
}

class MySpecificClass implements MyInterface<SomeOtherClass>
{
    public void aMethod(List<SomeOtherClass> aList)
    {
        StaticMethod.doSomething(aList);
    }
}

评论

P.S。我喜欢这个问题:)

答案 1 :(得分:0)

如果你确定aList包含可以安全地转换为<? super Foo>的对象,那么你可以这样做:

public static class MyClass<T> implements MyInterface<T> {
    @Override
    public void aMethod(List<T> aList) {
        StaticMethod.doSomething((List<? super Foo>) aList);
    }
}

请参阅完整且有效的示例:http://ideone.com/fvm67