【问题标题】:How to restrict the generic type to NOT extending a class?如何将泛型类型限制为不扩展类?
【发布时间】:2013-05-02 06:26:10
【问题描述】:

这些是在 Java 中创建“委托”的简单方法:

public static <B> Runnable runnableOf(B o, String methodName) {
    return findMethod(methodName, o.getClass(), o);
}
public static <B> Runnable runnableOf(Class<B> base, String methodName) {
    return findMethod(methodName, base, null);
}

这段代码有两种情况:当B(方法调用的类)不是Class&lt;?&gt;时,用户需要传递一个B的实例,因此该方法将是一个实例方法。否则,用户可以传递Class&lt;B&gt; 来调用静态方法。

但是,编译器抱怨它们模棱两可。我认为解决方案之一是在第一个重载中强制B 不是Class&lt;?&gt; 的实例。我该怎么做?

更新

上述代码的解决方案在我自己的回答中给出。但是,它没有回答标题中的问题。我希望任何人都可以回答它并给出另一个有意义的例子。

【问题讨论】:

  • 你的编译器版本是什么。 Eclipse 编译器不抱怨
  • Java 6 SE 和 Eclipse JDT 编译器都不会抱怨
  • 未发现编译错误。您可以尝试删除旧的 .class 文件,然后创建新的 .class 文件。
  • 模棱两可的是findMethod,而不是runnableOf。对此感到抱歉。

标签: java generics overloading


【解决方案1】:

抱歉,这是一个错误。问题是findMethod 不知道null 的类型是什么。所以修复如下:

public static <B> Runnable runnableOf(Class<B> base, String methodName) {
    return findMethod(methodName, base, (B)null);
}

我不知道天气是否人们可以做我在标题中描述的事情,但是在我的示例中它不是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多