Pertanyaan Konstruktor Groovy


Saya mengalami masalah saat menggunakan konstruktor dengan kelas Groovy.

saya ada kelas Data dalam sebuah file bernama Data.groovy dengan kelas batin ContentEntry. Saya ingin menginisialisasi ContentEntry contoh dari a Data metode:

static void initContent(nid, uid)
{
    curContent = new ContentEntry()
    curContent.nid = nid;
    curContent.uid = uid;
}

dengan ContentEntry didefinisikan sebagai:

class ContentEntry
{
    public int nid, uid 
    private tags = [:]

    public ContentEntry()
    {

    }

    ContentEntry(int nid, int uid)
    {
        this.nid = nid
        this.uid = uid
    }

    //omitted rest of the class

Tetapi ketika menjalankan proyek itu memberi saya kesalahan berikut:

Exception in thread "main" org.codehaus.groovy.runtime.metaclass.MethodSelectionException:
Could not find which method <init>() to invoke from this list:
public it.softit.Data$ContentEntry#<init>(it.softit.Data, int, int)
public it.softit.Data$ContentEntry#<init>(it.softit.Data)

Ini seperti jika konstruktor secara implisit membutuhkan sebuah instance dari kelas luar yang dilewatkan sebagai parameter. Saya bertanya-tanya mengapa ..


12
2018-01-11 16:37


asal


Jawaban:


Persyaratan bahwa semua kelas batin (non-statis) membutuhkan referensi ke kelas luar mereka yang dipaksakan oleh Java, daripada Groovy. Jika Anda instantiate kelas batin dari metode non-statis, referensi harus diatur ke this. Namun, tidak ada this referensi dalam metode statis.

Untuk memperbaiki masalah:

  • Instantiasikan kelas batin dari metode non-statis
  • Jadikan kelas batin statis. Maka Anda dapat memberi contoh dari mana saja (tetapi tidak akan lagi memiliki referensi ke instance dari kelas luar).

9
2018-01-11 16:53



Tentu saja konstruktor membutuhkan sebuah instance dari kelas luar. Itulah mengapa kelas batin ada: hanya hidup di dalam kelas luar. Anda tidak dapat melembagakan kelas batin di luar kelas luarnya.


4
2018-01-11 16:48



Di Jawa terjadi hal yang sama, tetapi ketika Anda memberi contoh instan, Anda tidak perlu menyertakan parameter tersembunyi.

Cobalah salah satu dari dua hal berikut:

  1. mendeklarasikan kelas batin statis (I harap Anda dapat melakukannya di Groovy juga)
  2. lewat this dalam penciptaan itu ContentEntry contoh ... :)

2
2018-01-11 16:52