Java的Generic,Inheritance和Inner静态类编译问题

时间:2017-03-29 10:01:41

标签: java android-studio generics javac

我有一些奇怪的编译问题,与使用继承的静态内部类作为泛型类型有关。

以防万一:每个代码段都是相同包中的单独类。

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

注意:

  1. 当我取消注释import com.company.ParentOuter.ParentInner;时 编译成功。
  2. 当我在<TopLevelChild>中使用<ChildInner>代替ChildOuter时,编译成功
  3. 问题:

    1. 所以,从我看到的情况来看,javac无法确定, 当ChildInner用作ParentInner时,它是javac的子类 通用类型。

      真的是这样吗?如果是这样 - 为什么呢?预期行为或ParentInner中的问题?

    2. 同时 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; }

    3. P.S。我长期面对类似的问题,但最后决定发布这个问题。

      希望,这不是重复,因为我第一次无法在单一来源中找到答案,也无法通过分析答案/文章的组合来找到答案。

1 个答案:

答案 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 {
    }
}

如果这有帮助,请告诉我。感谢