添加方法时java中的错误

时间:2016-08-03 11:28:49

标签: java

我读到你可以为对象添加额外的方法,或者以这种方式覆盖抽象方法,但是我有一个错误。你能告诉我这是否可能或我做错了什么?

public abstract class Pesti {
    public abstract void ud();
}

public class EX2 {
    public static void main(String[] args) {
        Pesti p = new Pesti() {
            public void ud() {
                System.out.println("Pestele este ud!");
            }

            public void inn() {
                System.out.println("Innoata!");
            }
        };
        p.ud();
        p.inn();
    }
}

它告诉我它无法找到方法inn

4 个答案:

答案 0 :(得分:6)

您正在做的是创建var result = Cars .FirstOrDefault(car=>Conditions.Any(cond=> cond.Speed == car.Speed && cond.Color == car.Color)); 的匿名子类。但是,由于Pesti变量的类型为p,因此只能调用Pesti类(或其任何超类)中声明的方法。因此,您可以拨打Pesti,但不能拨打ud()

如果您可以将inn()转换为子类的类型,则可以调用p,但由于这是一个匿名子类实例,因此您无法转换为那种类型。

您可以在inn()中将inn()声明为抽象(或具体)方法。然后你的代码将通过编译,并且将执行匿名子类实例中此方法的实现。

Pesti

答案 1 :(得分:1)

您将use Mojo::Base -strict; use Test::Mojo; use Test::More; package MyApp::Example; use Mojo::Base 'Mojolicious::Controller'; sub search { my ($self, $args, $cb) = @_; $self->$cb($args, 200); } package main; use Mojolicious::Lite; plugin Swagger2 => {url => 'data://main/multi-param.json'}; my $t = Test::Mojo->new; $t->get_ok('/search?myfield=1&myfield=2&myfield=3')->status_is(200)->json_is('/myfield', [1, 2, 3]); done_testing; __DATA__ @@ multi-param.json { "swagger": "2.0", "info": {"version": "1.0", "title": "Test multi"}, "paths": { "/search": { "get": { "x-mojo-controller": "MyApp::Example", "operationId": "search", "parameters": [ { "name": "myfield", "in": "query", "type": "array", "collectionFormat": "multi", "uniqueItems": true, "items": { "type": "string" }, "required": false } ], "responses": { "200": {"description": "whatever", "schema": {"type": "object"}} } } } } } 声明为p的实例,但尝试使用Pesti中未定义的方法。将对象声明为抽象类时,只能使用此类中定义的方法。要使用Pesti方法,您还必须在Pesti类中声明此方法。另外,您可以编写一个扩展inn()的类来实现Pesti方法,并将您的对象声明为扩展类。

答案 2 :(得分:0)

Pesti是一个abstract类,只有一种方法(abstract):ud()。因此,使用类型Pesti声明的变量只能用于调用ud()或类ObjectPesti的隐式超类)中的任何方法。使用此类型声明p,因此尽管实际上是方法inn()的{​​{3}}实例,但在声明变量的上下文中此方法不可用输入Pesti

也许您打算将inn()方法添加到Pesti,以便所有实例都必须实现它:

public abstract class Pesti {
    public abstract void ud();
    public abstract void inn();
}

或者您可能根本不想使用匿名类,并希望使用Pesti方法创建inn()的子类:

public class PestiImpl extends Pesti {
    @Override
    public void ud() {
        System.out.println("Pestele este ud!");
    }

    public void inn() {
        System.out.println("Innoata!");
    }
}

(或者你可以在两者之间有一层继承;一些abstract类扩展Pestiinn()声明为abstract方法,如果你有其他类像这样inn()方法,但有些Pesti没有)。

附注:我强烈建议在适当的地方使用anonymous class注释,以使代码更具可读性,并避免在尝试覆盖方法时出现拼写错误。您可以让大多数IDE自动插入它。

答案 3 :(得分:-1)

认为你需要看看这个link,我不知道你想做什么,但是你无法实例化抽象类,你可以在我的链接中找到详细的描述,希望它能够帮助你