簡體   English   中英

在java中調用匿名類方法

[英]call anonymous class method in java

我正在嘗試為以下問題編寫代碼:WAP獲取empno,DOB和少數員工的薪水。 編寫兩個匿名內部類,一個實現一個接口,根據他們的DOB對員工進行排序;另一個匿名內部類,擴展一個類,根據他們的工資對員工進行排序。 我的代碼是:

 //required import statements

public class OuterClass {
    private int empno;
    private String DOB;
    private int salary;

    public OuterClass() {
        // TODO Auto-generated constructor stub
    }

    public OuterClass(int empn, String dob, int sal) {
        //code for paramaterized constructor
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<OuterClass> list = new ArrayList<OuterClass>();
        while (true) {
            //code for input from user and adding it in list
        }   
    }

    Employee abc = new Employee() {
        @Override
        void SalarySort(List<OuterClass> l) {
            Collections.sort(l, new Comparator<OuterClass>() {
                public int compare(OuterClass e1, OuterClass e2) {
                    return e1.salary - e2.salary;
                }
            });
            Iterator<OuterClass> itr = l.iterator();
            while (itr.hasNext()) {
                OuterClass employee = (OuterClass) itr.next();
                System.out.println("Emp no : " + employee.empno + " Emp dob : "
                        + employee.DOB + " Emp Salary : " + employee.salary);
            }
        }

    }.SalarySort(list);// compile error : create local field list

}

class Employee {
    void SalarySort(List<OuterClass> l) {

    }
}

我的問題是,我無法調用匿名類Employee的方法SalarySort,如何解決問題?

如果你減少非編譯部分的代碼,它歸結為

Employee abc = new Employee() { ... }.SalarySort(list);

因此,您嘗試使用SalarySort()方法返回的值初始化Employee類型的變量abc ,該方法返回void。

你只是想要

Employee abc = new Employee() { ... };
abc.SalarySort(list);

要么

new Employee() { ... }.SalarySort(list);

順便說一句,閱讀編譯器錯誤消息可能有助於找到問題。

另一個問題是上面的代碼應該在main方法中,其中list是定義的,而不是在它之外。

此外,尊重Java命名約定,並為類,方法和變量選擇好名稱。 不要將員工稱為非員工的東西。 不要將XxxInnerClass命名為不是內部類的東西。

這個怎么樣 ? 它使用Anonymous內部類來實現接口並擴展類。

import java.util.Arrays;
import java.util.Comparator;

public class AnonymousInner
{
int empNo;
double salary;
MyDate dateOfBirth;
public AnonymousInner(int empNo, double salary, MyDate dateOfBirth)
{
    this.empNo = empNo;
    this.salary = salary;
    this.dateOfBirth = dateOfBirth;
}

@Override
public String toString()
{
    return "\nEmployee = " + empNo + " Salary= " + salary + " DOB= " + dateOfBirth;
}
public static void main(String[] args)
{
    AnonymousInner[] a =
    {new AnonymousInner(1, 5000, new MyDate(15, 0, 1994)), new AnonymousInner(2, 4000,
            new MyDate(15, 1, 1993)), new AnonymousInner(3, 5000, new MyDate(15, 0, 1995)),
            new AnonymousInner(4, 6000, new MyDate(16, 0, 1994)), new AnonymousInner(5, 9000,
                    new MyDate(15, 1, 1994))};

    Arrays.sort(a, new Comparator<AnonymousInner>()  //This creates anonymous class that implements an interface
    {

        @Override
        public int compare(AnonymousInner o1, AnonymousInner o2)
        {

            return ((Double) o1.salary).compareTo(o2.salary);
        }
    });
    System.out.println("Sorting on Salary");
    for (AnonymousInner s : a)
    {
        System.out.println(s);
    }

    a = new sortDOB()
    {
    }.sort(a);  //this creates Anonymous class that extends a class

    System.out.println("\nSorting on DOB\n");
    for (AnonymousInner s : a)
    {
        System.out.println(s);
    }

}

}

class sortDOB
{

public AnonymousInner[] sort(AnonymousInner[] x)
{
    int size = x.length;
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size - 1; j++)
        {
            int k = j + 1;
            int compare = (x[j].dateOfBirth).compareTo(x[k].dateOfBirth);
            if (compare == 1)
            {
                AnonymousInner temp = x[j];
                x[j] = x[k];
                x[k] = temp;

            }
        }
    }
    return x;
}
}

class MyDate implements Comparable<MyDate>
{
int year, month, day;
public MyDate(int day, int month, int year)
{
    this.year = year;
    this.month = month;
    this.day = day;
}

public MyDate()
{
}

@Override
public String toString()
{
    return day + "/" + month + "/" + year;
}

@Override
public int compareTo(MyDate o2)
{
    if (year == o2.year)
    {
        if (month == o2.month)
        {
            if (day == o2.day)
            {
                return 0;
            }
            else if (day < o2.day)
            {
                return -1;
            }
            else
            {
                return 1;
            }

        }
        else if (month < o2.month)
        {
            return -1;
        }
        else
        {
            return 1;
        }
    }
    else if (year < o2.year)
    {
        return 1;
    }
    else
    {
        return -1;
    }

}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM