Ошибка в следующем Groovy-коде. В чем проблема? - PullRequest
0 голосов
/ 24 марта 2011

Привет всем, следующий код не выполняется, код

class Invoice{
        List items
        Date date
}
class LineItem{
        Product product
        int count
        int total(){
                return product.dollar * count
        }
}
class Product{
        String name
        def dollar
}
def ulcDate = new Date(107,0,1)
def ulc = new Product(name:'ULC', dollar:200)
def ve = new Product(name:'Visual Editor',dollar:500)
def invoices =[new Invoice(date:ulcDate, items: [new LineItem(count:5, product:ulc),new LineItem(count:2, product:ve)]), new Invoice(date:[107,1,1],items:[new LineItem(count:4,product:ve)])]
assert [200,500,400] == invoices.items*.total()

Это имя файла Test.groovy, и когда я выполняю вот так groovy Test я получаю такую ​​ошибку:

Caught: groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.total() is applicable for argument types: () values: []
Possible solutions: tail(), getAt(groovy.lang.Range), getAt(java.util.Collection), getAt(int), getAt(java.lang.String), getAt(java.lang.String)
    at In1.run(In1.groovy:20)

Даже если я определил метод total(), он выдает ошибку?В чем причина?

Ответы [ 2 ]

4 голосов
/ 24 марта 2011

Относительно строки:

assert [200,500,400] == invoices.items*.total()

invoices.items возвращает List<List<LineItem>>, поэтому invoices.items*.total() терпит неудачу, поскольку внешний List не имеет total() метода.

Если вы хотите получить сумму по каждому элементу LineItem, просто удалите внешний List, позвонив по номеру flatten()

assert [1000, 1000, 2000] == invoices.items.flatten()*.total()

Если вы хотите получить общую стоимость каждого счета, попробуйте следующее

assert [2000, 2000] == invoices.items*.sum { it.total() }
0 голосов
/ 24 марта 2011

Предполагая, что вы набрали cut'n'paste из своего кода, у вас есть опечатка ...

class LineItem{
    Product product
    int count
    int total**1**(){
            return product.dollar * count
    }
}

Удалите «1» из имени метода и повторите попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...