没有方法参数向下转换,无法调用位于另一个包中的上层类的静态方法

时间:2019-05-25 20:47:07

标签: java generics static-methods java-package

我的Java程序几乎具有以下类层次结构。

  • 顶级通用类Parent是抽象的,不是公共的,并且具有静态方法myStaticMethod()。

    package com.company.base.package_A;
    abstract class Parent<T> {
       ...
       public static <T> T myStaticMethod(Parent<T> v) { ... }
       ...
    }
    
  • 其子类Child是非通用的,公共的,位于com.company.base.package_A相同的包中。

    package com.company.base.package_A;
    public class Child extends Parent<Integer> { ... }
    
  • Child的GrandChild子类也是非通用的,但在另一个包com.company.base.package_B中。

    package com.company.base.package_B;
    import com.company.base.package_A.Child;
    public class GrandChild extends Child { ... }
    

在主要代码中,我仅导入GrandChild,创建一个通用的HashMap,并在其中填充GrandChild的多个实例:

import com.company.base.package_B.GrandChild;
HashMap<Integer, GrandChild> collection = new HashMap<Integer, GrandChild>();
collection.put(n, new GrandChild(...));

然后我尝试在GrandChild上调用myStaticMethod():

Integer res = GrandChild.myStaticMethod(collection.get(i));

但是我得到了这个奇怪的编译错误:

  

java:com.company.base.package_A.Parent在以下位置不公开   com.company.base.package_A;不能在包外访问

如果我在将其传递给myStaticMethod之前将“ get”的结果显式转换为GrandChild子类,则该错误消失:

Integer res = GrandChild.myStaticMethod((GrandChild)collection.get(i));

因此, Java只希望在未将参数显式转换为子类的情况下,上层类Parent才可见(公共)!我无法理解...我需要帮助来回答以下问题:

Q1 :假设我不能将GrandChild而是某些上层阶级的实例放到地图中。即使在这种情况下, GrandChild .myStaticMethod(...)也不表示Java应该在GrandChild中而不是Parent中寻找myStaticMethod,因此我们不需要公开后者吗?

第二季度:错误消息与类型转换无关。这意味着Java希望顶级类Parent可见,以防万一我没有强制转换参数。但是在这种情况下,Java需要看什么Parent?它想在那找到什么?换句话说,上层阶级可见性和参数类型之间有什么联系?

0 个答案:

没有答案