[javac] ... error: incompatible types
[javac] exceptionClassHolder = new Holder<>( (new Exception()).getClass() );
[javac] ^
[javac] required: Holder<Class<? extends Exception>>
[javac] found: Holder<Class<CAP#1>>
[javac] where CAP#1 is a fresh type-variable:
[javac] CAP#1 extends Exception from capture of ? extends Exception
[javac] 1 error
class Holder<T> {
public T t;
public Holder(T t) {
this.t = t;
}
}
public class FooMain {
public static void main(String args[]) throws Exception {
Holder<Class<? extends Exception>> exceptionClassHolder;
exceptionClassHolder = new Holder<>( (new Exception()).getClass() );
}
}
不幸的是,现有的答案没有解释这里发生了什么。首先,解决方案是简单地将类型参数指定给holder
:
Holder<Class<? extends Exception>> exceptionClassHolder;
exceptionClassHolder =
new Holder<Class<? extends Exception>>(new Exception().getClass());
您的版本不起作用的原因是new Exception().getClass()
返回一个类<?extends Exception>
,其中?
是通配符捕获(在编译器错误消息中称为cap#1
)。由于将“菱形运算符”与新Holder<>
一起使用,编译器将类
推断为T
,因此Holder
是创建对象的类型。
但是,这与您声明的持有者
。它使用一个嵌套通配符,它不捕获:虽然cap#1扩展异常
是某种特定类型扩展exception
,但嵌套的?extends Exception
字面上表示扩展Exception
的任何类型。
通过手动指定类<?extends Exception>
对于T
,可以帮助编译器避免这个“陷阱”。
在这些帖子上看到我类似的答案:
我正在使用JPA,列类型为: 我使用PostgreSql作为我的数据库,它支持bpchar类型,现在我尝试为我的测试添加H2,但问题是,当我运行测试时,我得到以下结果: 是否有其他方法可以实现这一目标?
我定义jackoson序列化器并将其添加到java类中,如下所示: 编译器出现以下错误: 注释的定义为: 如果我从ReportFilterDeserializer中删除泛型attibute,它将通过编译。我不明白编辑为什么抱怨。
这基本上是我第一次接触Java泛型类型,我不知道下面的代码有什么问题。 我有一个helper类,它具有一个静态函数inRange-usng-generic类型,该函数应该从输入列表中返回对象列表,这些对象在索引处的对象周围的特定范围内(我还没有测试它,如果它工作正常与否,这不是问题): 然后我想在一个类中使用它: 类型为
我按照这个教程:https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer 现在我在这一点上: 我的问题是这条线... 显示一个错误:不兼容的类型。需要android。应用程序。FragmentManager发现:android。支持v4.app。碎片管理器。 我看到了一些帖子,但它们不适合我。 我用AppC
我正在尝试使用reverfit和RxJava在我正在使用的应用程序中的自定义视图中进行API调用,但是当我尝试订阅来自我的reverfit API调用的Observable时,遇到了一个不兼容类型错误。 我的改装界面: } 和位于自定义视图的onFinishInflate()中的改装调用: 当我构建项目时,在自定义视图中以可观察的 query=...开头的行中遇到了不兼容类型错误: 错误:(60,