Java';s泛型、继承和内部静态类编译问题
我有一个奇怪的编译问题,与使用继承的静态内部类作为泛型类型有关 以防万一:每个单独的代码片段都是相同包中的一个独立的类 父外部和父内部: 汇编结果如下:Java';s泛型、继承和内部静态类编译问题,java,android-studio,generics,javac,Java,Android Studio,Generics,Javac,我有一个奇怪的编译问题,与使用继承的静态内部类作为泛型类型有关 以防万一:每个单独的代码片段都是相同包中的一个独立的类 父外部和父内部: 汇编结果如下: $ javac *.java ChildOuter.java:8: error: cannot find symbol public static class ChildInner extends ParentInner { ^ symbol:
$ javac *.java
ChildOuter.java:8: error: cannot find symbol
public static class ChildInner extends ParentInner {
^
symbol: class ParentInner
location: class ChildOuter
ChildOuter.java:6: error: type argument ChildInner is not within bounds of type-variable T
public class ChildOuter extends ParentOuter <ChildInner> {
^
where T is a type-variable:
T extends ParentInner declared in class ParentOuter
2 errors
$javac*.java
java:8:错误:找不到符号
公共静态类ChildInner扩展了ParentInner{
^
符号:类ParentInner
地点:ChildOuter类
java:6:错误:类型参数ChildInner不在类型变量T的范围内
公共类ChildOuter扩展ParentOuter{
^
其中T是一个类型变量:
T扩展类ParentOuter中声明的ParentInner
2个错误
注:
import com.company.ParentOuter.ParentInner;
编译成功ChildOuter
中使用
而不是
时,编译成功javac
无法确定,
当它用作
泛型类型
真的是这样吗?如果是,那么为什么?预期的行为或问题是否在javac
中ParentInner
突出显示为“未使用的导入”,并在运行“优化导入”时将其删除,这使得代码无法编译
那么,这又是安卓工作室的问题还是javac的问题呢p.S.我在很长一段时间内都面临着类似的问题,但最终决定发布这个问题
希望不会重复,因为这是我第一次无法从单一来源或通过分析答案/文章组合找到答案。是的,我们可以在不导入“ParentInner”的情况下解决此问题 根本原因是,编译器无法解析“ParentInner”。因为“ParentInner”是“ParentOuter”的静态成员 因此,我们可以简单地提到“ParentOuter.ParentInner”,而不是导入“ParentInner” 请查找经过调整的ChildOuter.java
package com.company;
import com.company.ChildOuter.ChildInner;
//import com.company.ParentOuter.ParentInner;
public class ChildOuter extends ParentOuter <ChildInner> {
public static class ChildInner extends ParentOuter.ParentInner {
}
}
package.com公司;
导入com.company.ChildOuter.ChildInner;
//导入com.company.ParentOuter.ParentInner;
公共类ChildOuter扩展ParentOuter{
公共静态类ChildInner扩展了ParentOuter.ParentInner{
}
}
如果这有帮助,请告诉我。谢谢是的,我们可以在不导入“ParentInner”的情况下解决此问题 根本原因是,编译器无法解析“ParentInner”。因为“ParentInner”是“ParentOuter”的静态成员 因此,我们可以简单地提到“ParentOuter.ParentInner”,而不是导入“ParentInner” 请查找经过调整的ChildOuter.java
package com.company;
import com.company.ChildOuter.ChildInner;
//import com.company.ParentOuter.ParentInner;
public class ChildOuter extends ParentOuter <ChildInner> {
public static class ChildInner extends ParentOuter.ParentInner {
}
}
package.com公司;
导入com.company.ChildOuter.ChildInner;
//导入com.company.ParentOuter.ParentInner;
公共类ChildOuter扩展ParentOuter{
公共静态类ChildInner扩展了ParentOuter.ParentInner{
}
}
让我知道这是否有帮助。谢谢Rajesh,谢谢
扩展ParentOuter。ParentInner
修复。它确实编译得很好,我对这个想法没有异议。但有两件事我仍然不完全清楚。首先:为什么指定ParentOuter。
只有在与泛型一起使用时才需要?例如,当我删除泛型时c来自ParentOuter
和ChildOuter
的信息我可以自由编写和编译ChildInner扩展ParentInner
,等等。第二个问题是为什么IDEA将ParentOuter.ParentInner
删除为冗余,但没有它的代码就不能编译?这是IDEA中的错误吗?Rajesh,谢谢扩展ParentOuter.ParentInner
fix。它确实编译得很好,我对这个想法没有异议。但有两件事我还不完全清楚。首先:为什么指定ParentOuter.
只有在与泛型一起使用时才需要?例如,当我从ParentOuter
和ChildOuter
中删除泛型信息时,我可以自由编写和编译ChildInner扩展了ParentInner
,等等。第二个问题是为什么IDEA将ParentOuter.ParentInner删除为冗余,但没有它代码就无法编译?这是IDEA中的错误吗?
$ javac *.java
ChildOuter.java:8: error: cannot find symbol
public static class ChildInner extends ParentInner {
^
symbol: class ParentInner
location: class ChildOuter
ChildOuter.java:6: error: type argument ChildInner is not within bounds of type-variable T
public class ChildOuter extends ParentOuter <ChildInner> {
^
where T is a type-variable:
T extends ParentInner declared in class ParentOuter
2 errors
package com.company;
import com.company.ChildOuter.ChildInner;
//import com.company.ParentOuter.ParentInner;
public class ChildOuter extends ParentOuter <ChildInner> {
public static class ChildInner extends ParentOuter.ParentInner {
}
}