【发布时间】:2011-11-10 09:55:39
【问题描述】:
在下面的代码中,我给出了两个主要类 - TestWorks 和 TestCompilesButFails。我不确定我是否理解失败 - 似乎 Arrays.asList() 表达式被赋予“AbstractBaseClass 列表”类型,但为什么在这里给出引用包本地类的类型是正确的在另一个包中?
// failing test class
import somepackage.*;
import java.util.Arrays;
public class TestCompilesButFails {
public static void main(String [] args){
// fails here with java.lang.IllegalAccessError:
// tried to access class somepackage.AbstractBaseClass
// from class TestCompilesButFails
for (Object o : Arrays.asList(new ConcreteA(), new ConcreteB())) {
System.out.println(o);
}
}
}
// package-local abstract base class
package somepackage;
abstract class AbstractBaseClass {
public abstract void doSomething();
}
// next two classes - public extenders of abstract base class
package somepackage;
public class ConcreteA extends AbstractBaseClass {
public void doSomething(){
System.out.print("Look, ma!\n");
}
}
package somepackage;
public class ConcreteB extends AbstractBaseClass {
public void doSomething(){
System.out.print("No types!\n");
}
}
// working test
import somepackage.*;
public class TestWorks {
public static void main(String [] args){
new ConcreteA().doSomething();
new ConcreteB().doSomething();
}
}
【问题讨论】:
-
只是为了消除另一个因素 - 将 Arrays.asList() 替换为 private static
List myAsList(T first, T second) 会出现同样的问题 - 它与可变参数无关在 Arrays.asList()
标签: java generics types module packages