使用通配符导入的行为与用户包的行为不同

时间:2015-12-08 15:56:52

标签: java

 //With these I am getting compilation - error class not found 
 /*import Shape.TwoD.*;
 import Shape.ThreeD.*;
 import Shape.*;*/

 import Shape.TwoD.Circle;
 import Shape.TwoD.Line;
 import Shape.ThreeD.Line3D;
 import Shape.ThreeD.Sphere;
 import Shape.Actions;

public class Test {

    /**
     * Creates a new instance of <code>Test</code>.
     */
     int o;
    public Test() {

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Actions obj[] = new Actions[4];
        obj[0] = new Line(1,2,3,4);
        obj[1] = new Circle(1,2,3);
        obj[2] = new Line3D(1,2,3,4,5,6);
        obj[3] = new Sphere(1,2,3,4);
        for(Actions x: obj)
            x.draw();
        Actions.TwoD o =(Circle)obj[1];
        System.out.println("Area of circle "+o.area());
        o = (Sphere)obj[3];
        System.out.println("Volume of sphere "+o.area());
    }
}

Action是一个包含嵌套接口TwoDThreeD

的接口

为什么导入通配符不能在上面的代码中工作?我使用它错了吗?

我找不到任何相关的答案,如果通配符和完全限定的导入都不起作用,那么我的代码就会出现问题,但在这种情况下,只有当我使用带通配符的通配符时才会出现编译错误class not found

编辑: 抱歉错误的命名约定,LineCircleLine3DSphere是类 LineCircle位于Shape.TwoD

之下

Line3DSphere位于Shape.ThreeD

之下

Actions.java:

包形状;

public interface Actions {

        interface ThreeD{
            double volume();
        }

        interface TwoD{
            double area();
        }

        void draw();
        //void erase();
        final double pi = 3.142857;

}

Line.java:

    package Shape.TwoD;

public class Line implements Shape.Actions{

    BaseObj.Point p1,p2;

    public Line(int x1,int y1, int x2 ,int y2) {
        p1 = new BaseObj.Point(x1,y1);
        p2 = new BaseObj.Point(x2,y2);
    }

    public void draw(){
        //System.out.println("Line between ("+p1.x+","+p1.y+") and ("+p2.x+","+p2.y+"));
        System.out.println("Line between ("+p1.getx()+","+p1.gety()+") and ("+p2.getx()+","+p2.gety()+") has been drawn");
    }

}

Circle.java:

package Shape.TwoD;

public class Circle extends BaseObj.Point implements Shape.Actions, Shape.Actions.TwoD{

    protected int radius;

    public Circle(int x, int y, int radius) {
        super(x,y);
        this.radius = radius;
    }

    public void draw(){
        System.out.println("Circle with ("+x+","+y+") as center and radius "+radius+" units has been drawn");
    }

    public double area(){
        return (pi*radius*radius);
    }

}

Line3D.java:

package Shape.ThreeD;
public class Line3D  implements Shape.Actions {

    BaseObj.Point3D p1,p2;

    public Line3D(int x1,int y1, int z1, int x2,int y2, int z2) {
        p1 = new BaseObj.Point3D(x1,y1,z1);
        p2 = new BaseObj.Point3D(x2,y2,z2);
    }

    public void draw(){
        //System.out.println("Line between ("+p1.x+","+p1.y+") and ("+p2.x+","+p2.y+"));
        System.out.println("Line between ("+p1.getx()+","+p1.gety()+","+p1.getz()+") and ("+p2.getx()+","+p2.gety()+","+p2.getz()+") has been drawn");
    }

}

Sphere.java:

package Shape.ThreeD;
public class Sphere extends Shape.TwoD.Circle{

    int z;

    public Sphere(int x, int y, int z, int radius) {
        super(x,y,radius);
        this.z = z;
    }

    public void draw(){
        System.out.println("Spere with ("+x+","+y+","+z+") as center and radius "+radius+" units has been drawn");
    }

    public double volume(){
        return(radius*radius*pi*4/3);
    }

    public double area(){
        System.out.println("Sphere is a 3D object so 2D quantitys doesnt apply");
        return 0.0;
    }
}

EDIT2: 在更正名称后,我收到Actions接口重复的错误,因此我将其名称更改为ObjActions并解决了问题。谢谢您的帮助。我希望我在下面使用的命名约定符合标准。

ObjActions.java

package shape;

public interface ObjActions {

        interface Actions3D{
            double volume();
        }

        interface Actions2D{
            double area();
        }

        void draw();
        //void erase();
        final double pi = 3.142857;

}

Circle.java

package shape.twod;

public class Circle extends baseobj.Point implements shape.ObjActions, shape.ObjActions.Actions2D{

    protected int radius;

    public Circle(int x, int y, int radius) {
        super(x,y);
        this.radius = radius;
    }

    public void draw(){
        System.out.println("Circle with ("+x+","+y+") as center and radius "+radius+" units has been drawn");
    }

    public double area(){
        return (pi*radius*radius);
    }

}

Line.java

package shape.twod;

public class Line implements shape.ObjActions{

    baseobj.Point p1,p2;

    public Line(int x1,int y1, int x2 ,int y2) {
        p1 = new baseobj.Point(x1,y1);
        p2 = new baseobj.Point(x2,y2);
    }

    public void draw(){
        //System.out.println("Line between ("+p1.x+","+p1.y+") and ("+p2.x+","+p2.y+"));
        System.out.println("Line between ("+p1.getx()+","+p1.gety()+") and ("+p2.getx()+","+p2.gety()+") has been drawn");
    }

}

Line3D.java

package shape.threed;

public class Line3D  implements shape.ObjActions {

    baseobj.Point3D p1,p2;

    public Line3D(int x1,int y1, int z1, int x2,int y2, int z2) {
        p1 = new baseobj.Point3D(x1,y1,z1);
        p2 = new baseobj.Point3D(x2,y2,z2);
    }

    public void draw(){
        //System.out.println("Line between ("+p1.x+","+p1.y+") and ("+p2.x+","+p2.y+"));
        System.out.println("Line between ("+p1.getx()+","+p1.gety()+","+p1.getz()+") and ("+p2.getx()+","+p2.gety()+","+p2.getz()+") has been drawn");
    }

}

Sphere.java

package shape.threed;

public class Sphere extends shape.twod.Circle implements shape.ObjActions.Actions3D{

    int z;

    public Sphere(int x, int y, int z, int radius) {
        super(x,y,radius);
        this.z = z;
    }

    public void draw(){
        System.out.println("Spere with ("+x+","+y+","+z+") as center and radius "+radius+" units has been drawn");
    }

    public double volume(){
        return(radius*radius*pi*4/3);
    }

}

Test.java

package test;

 import shape.twod.*;
 import shape.threed.*;
 import shape.*;


 /*import shape.twod.Circle;
 import shape.twod.Line;
 import shape.threed.Line3D;
 import shape.threed.Sphere;
 import shape.Actions;*/

public class Test {

    /**
     * Creates a new instance of <code>Test</code>.
     */
     int o;
    public Test() {

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        ObjActions obj[] = new ObjActions[4];
        obj[0] = new Line(1,2,3,4);
        obj[1] = new Circle(1,2,3);
        obj[2] = new Line3D(1,2,3,4,5,6);
        obj[3] = new Sphere(1,2,3,4);
        for(ObjActions x: obj)
            x.draw();
        ObjActions.Actions2D o =(Circle)obj[1];
        //Actions2D o =(Circle)obj[1];
        System.out.println("Area of circle "+o.area());
        ObjActions.Actions3D op = (Sphere)obj[3];
        System.out.println("Volume of sphere "+op.volume());
    }
}

1 个答案:

答案 0 :(得分:0)

&#34;包&#34;根据{{​​3}},TwoDThreeD可能会被接口Action.TwoDAction.ThreeD(反之亦然)遮蔽:

  

声明可能被简单名称为Vector的类型的单一类型导入声明遮蔽;通过名为Vector的类型并在编译单元所属的包中声明;或任何嵌套的类或接口。

     

声明可能会被名为Vector的字段,参数或局部变量的声明所掩盖。

     

(任何这些情况都会发生。)