我有一些奇怪的编译问题,与使用继承的静态内部类作为泛型类型有关。
以防万一:每个代码段都是相同包中的单独类。
ParentOuter& ParentInner:
public class ParentOuter <T extends ParentOuter.ParentInner> {
T field;
public static class ParentInner {
}
}
ChildOuter&amp; ChildInner:
import com.company.ChildOuter.ChildInner;
//import com.company.ParentOuter.ParentInner;
public class ChildOuter extends ParentOuter <ChildInner> {
public static class ChildInner extends ParentInner {
}
}
TopLevelChild:
public class TopLevelChild extends ParentOuter.ParentInner {
}
以下是汇编的结果:
$ 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
注意:
import com.company.ParentOuter.ParentInner;
时
编译成功。<TopLevelChild>
中使用<ChildInner>
代替ChildOuter
时,编译成功问题:
所以,从我看到的情况来看,javac
无法确定,
当ChildInner
用作ParentInner
时,它是javac
的子类
通用类型。
真的是这样吗?如果是这样 - 为什么呢?预期行为或ParentInner
中的问题?
同时 Android Studio 将Android Studio
的导入突出显示为“未使用的导入”,并在运行时删除“优化导入“,这使得代码无法编译。
那么,再次 - 问题是javac
还是public static String doDecrypt(String data, String key){
String decryptedData = null;
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] keyBytes = new byte[16];
byte[] b = key.getBytes("UTF-8");
int len = b.length;
if (len > keyBytes.length)
len = keyBytes.length;
System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] results = new byte[data.length()];
try {
results = cipher.doFinal(Base64.decode(data,Base64.DEFAULT));
} catch (Exception e) {
Log.i("Erron in Decryption", e.toString());
}
Log.i("Data", new String(results, "UTF-8"));
decryptedData = new String(results, "UTF-8");
}
catch (Exception e) {
e.printStackTrace();
return null;
}
return decryptedData;
}
?
P.S。我长期面对类似的问题,但最后决定发布这个问题。
希望,这不是重复,因为我第一次无法在单一来源中找到答案,也无法通过分析答案/文章的组合来找到答案。
答案 0 :(得分:2)
是的,我们可以在不导入“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 {
}
}
如果这有帮助,请告诉我。感谢