【问题标题】:Is it possible to impose an upper bound (super X) on a named Generic type?是否可以对命名的通用类型施加上限(超级 X)?
【发布时间】:2011-06-04 10:47:24
【问题描述】:

假设我有以下静态方法和接口(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

【问题讨论】:

  • 我假设你不能要求MyClass 实现MyInterface&lt;Long&gt;?可以工作,但不能完全达到你想要的效果。
  • 仅供参考:Angelika Langer 涵盖了 here 类型的下界
  • @McDowell 这很有帮助。有趣的是,通配符允许下限。我需要再考虑一下——这个例子是否为安吉丽卡·兰格的论点提供了一个反例

标签: java generics wildcard super


【解决方案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);
    }
}

评论?

附言我喜欢这个问题:)

【讨论】:

  • 这稍微澄清了问题-现在 MyClass 不再是通用的(如您所说),它需要明确指定上限。不是一个解决方案,但我不确定 Java 语言中的解决方案是否可行。哦,好吧,我可能不得不忍受 MyClass 不是通用的。
【解决方案2】:

如果您确定 aList 包含可以安全地转换为 &lt;? super Foo&gt; 的对象,那么您可以这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-30
    • 2022-01-18
    • 1970-01-01
    • 2010-10-28
    • 2021-01-08
    • 2012-07-31
    • 2019-08-29
    • 2019-06-06
    相关资源
    最近更新 更多