调用/分配实现接口的Class的变量

时间:2017-07-19 12:08:21

标签: java class variables inheritance interface

我写了一个简单的接口继承示例来说明我正在尝试做什么。

interface Fruit{
     public void taste();    
}


class Banana implements Fruit {
     public String name = "Banana"; 
     public void taste(){
         System.out.println("yummy banana!");
     }


class Strawberry implements Fruit {
     public String name = "Strawberry"; 
     public void taste(){
         System.out.println("yummy strawberry!");
     }
}

class Lunch<Fruittype implements Fruit> {
     public Fruittype fruit;

     public void tasteit() {
         System.out.println("I'm going to eat a"+ fruit.name + "!" );
         // error: name cannot be resolved or is not a field
         fruit.taste();
     }
}

class exec {
     public static void main(String[] args) {
          Lunch<Banana> bananalunch  = new Lunch<>;
          bananalunch.fruit = new Banana();
          bananalunch.tasteit();
     }
}

香蕉和草莓正在实施水果。在午餐班我试图称之为水果名称及其功能味道(); 虽然调用函数的味道很好,但我无法调用名称(请参阅:注释中的错误)

通缉输出: 我要去吃香蕉! 美味的香蕉!

就像我说的,美味的香蕉有效,但名称无法解决。我试图声明“public String name =”default“”;在Fruit界面中。然后你可以调用它,但它总是会说“默认”而不是实际类中的名字。

有没有办法获得实现接口的泛型类型的成员? 附:我需要像这样做,当然这个代码仅用于表示,但我有一个更大的更复杂的代码,我遇到了这个问题 - 如果没有必要,我不想重组它。

提前谢谢!

2 个答案:

答案 0 :(得分:3)

您的问题是由于尝试直接访问实例成员而引起的 - fruit.name - 而不是通过方法 - fruit.getName()

如果使用getter方法,将执行正确的方法并返回所需的输出。

也就是说,在这个特定的例子中,在基类中使用单个getName()方法,在该基类中使用单个_name变量更有意义,该变量初始化为不同的价值根据实际的水果类别而定。

另一方面,看到您的Fruit是接口而不是基类,您可以让实现该接口的每个类都使用getName()方法返回不同的值。 / p>

例如:

class Strawberry implements Fruit {
     public String name = "Strawberry"; 
     public void taste(){
         System.out.println("yummy strawberry!");
     }
}

会变成:

class Strawberry implements Fruit {
     public String getName () {
         return "Strawberry";
     }
     public void taste() {
         System.out.println("yummy strawberry!");
     }
}

您必须将getName()添加到界面:

interface Fruit {
     public String getName();
     public void taste();    
}

最后,您的Lunch课程变为:

class Lunch<Fruittype implements Fruit> {
     public Fruittype fruit;

     public void tasteit() {
         System.out.println("I'm going to eat a "+ fruit.getName() + "!" );
         fruit.taste();
     }
}

答案 1 :(得分:0)

当类实现接口时,意味着此类的对象可以执行接口中描述的操作。

例如,每个平面形状都有面积。所以我们可以确定界面:

interface PlaneShape {
    int getArea();
}

正方形区域是边缘的乘积。而圆的面积是产品 由pi数除以2的平方半径。所以:

class Square implements PlaneShape {
    public int edge = 5;

    public int getArea() {
        return edge*edge;
    }   
}

class Circle implements PlaneShape {
    public int radius = 5;
    public int pi = 3.14;

    public int getArea() {
        return radius*radius*pi/2;
    }   
}

接口用于抽象。 AreaCalculator以平面形状运行,因此它从任何特定类型的平面形状中抽象出来。 AreaCalculator只知道任何形状都可以通过执行getArea()方法给出区域值。 AreaCalculator不了解特殊形状字段,例如edgeradius

class AreaCalculator<S implemets PlaneShape> {
    public S shape;

    public int calculateArea() {
        shape.getArea();
    }
}

通过这种方式,在您的示例中,Lunch<Fruittype implements Fruit>班级对水果内部名称一无所知,但它并没有&#34;看到&#34;这个字段,它只能调用方法taste()。您需要将方法getName()添加到接口,并实现它。

关于界面中name="default"的主题。它在接口的上下文中声明,并且与实现没有任何关系。