2013-08-19 2 views
0

Students 클래스의 메서드에 액세스하려면 어떻게해야합니까? myList를 인쇄 할 때 students 클래스의 toString을 사용하므로 다른 메서드에 액세스하는 방법을 모르겠습니다. 그게 가능한가?Generics 및 ArrayList

추신 : 저는 이미 프로그램에서 시도하고 잡았습니다. 코드를 더 짧게 만들기 위해 게시하지 않았습니다.

public class DatabaseAccess <T> { 
    public T[] database; 
    public ArrayList<T>myList = new ArrayList<T>(); 
    public ArrayList<T> testlist = new ArrayList<T>(); 
    public void userInterface(){ 
    int count = 1; 
     for (T i : myList){ 
      System.out.println(count++ + ": " + i);  
     } 
    } 
    public void readDatabase(){ 
     try { 
       ObjectInputStream in = new ObjectInputStream(new FileInputStream("grocery.bin")); 
       database = (T[]) in.readObject(); 
        for (int i = 0; i < database.length; i++){ 
         myList.add(database[i]);  
       } 
       myList.add((T) "\n"); 
       myList.add((T) "\tStudents:"); 
       ObjectInputStream in1 = new ObjectInputStream(new FileInputStream("students.bin")); 
       database = (T[]) in1.readObject(); 
        for (int i = 0; i < database.length; i++){ 
         myList.add(database[i]); 
        } 
    } 
} 



    public class Student implements Serializable, Comparable{ 
    private String name, id, address; 
    private double gpa; 

    public Student(String name, String id, double gpa){ 
     this.name = name; 
     this.id = id; 
     this.gpa = gpa; 
    } 
    public int compareTo(Object object){ 
     Student student = (Student) object; 
     if(this.gpa < student.getGpa()) 
       return -1; 
     else 
       if(this.gpa > student.getGpa()) 
      return 1; 
       else 
        return 0; 
    } 
    public String getName(){ return name;} 
    public String getId(){ return id;} 
    public double getGpa(){ return gpa;} 
    public String toString(){ return (String.format("%16s%10.4s%8s", name, id, gpa));} 
} 
+0

많은 캐스팅이 여기에 있습니다. 적어도 하나 또는 두 개는 발생하지 않아도되고, 누락 된 것으로 보입니다. 무엇을 성취하려고합니까? 스택이 있다면 무엇입니까? 하드 코딩 된 입력 파일을 사용하여이 문제를 재현 할 수 있습니까? – Makoto

+0

나는 Student 클래스의 getMeethods에 액세스하려고 시도하고 있는데, 잘 모르겠습니다. 그리고 거기에 캐스팅은 무엇입니까? 캐스팅이 필요하지 않아요? –

+0

'T'는 항상'String'이며, 타입 매개 변수가 전혀 필요 없다고 생각합니다. 그렇지 않으면 코드를'T' 문자열로 캐스팅하면 목록에 힙 오염이 발생하여 런타임에 코드가 실패하게됩니다. –

답변

0

DatabaseAccess를 의미한다고 가정 할 경우 이론에서는 그렇지 않습니다.

자, 다음과 같은 것을 사용할 수는 있지만, 끔찍한 생각이며 나쁜 디자인을 악용합니다. (위법성이 없음 - 나는이 코드가 모두 괜찮다는 인상을주고 싶지 않습니다. 당신은 그것을 사용해야합니다 - 단지 기술적으로 가능하다는 것입니다 :

DatabaseAccess에 관한 한, 그것은 학생이 아닙니다. 기본적으로 아무 것도 모르는 T 형의 임의의 객체입니다. Student와 Food 사이에 원하는 인터페이스를 만들 수없는 경우이 DatabaseAccess가 클래스의 특성을 알아야하고 디자인을 실제로 구분해야하는 이유를 알아야합니다. sanely.

맞춤 인쇄를 수행하고 있습니까? 어쩌면 형식은 Student/Food 클래스 내에서 이루어져야합니다.

예, 예. 사용자 입력을 처리하고 데이터베이스의 객체에서 데이터를 조작합니까? 데이터베이스 액세스 및 데이터 조작에 대한 우려를 분리하십시오. GPA를 변경하면 반드시 데이터가 ObjectOutputStream 또는 Oracle Database에 저장되는지 여부를 알 필요는 없습니다. DatabaseAccess 데이터베이스를 다루고 정의 된 인터페이스를 통해 DatabaseAccess<Student>과 작동하는 다른 클래스를 정의하고 Student 관련 조작을 처리해야합니다.

당신이하고 싶은 것을 정확하게 알지 못하면서 다음과 같은 충고를하는 것이 어렵습니다. 당신이 묻고있는 것을해야한다고 생각하면 뒤로 물러나 더 나은 것이 있을지 생각해보십시오. 당신이하지 않도록 문제를 접근하는 방법.

+0

와우 나는 이것을 좋아한다! –

2

당신이 당신의 DatabaseAccess 클래스 내에서 T 인스턴스에서 Student 방법으로 액세스 할 수있게하려면, 당신은 Student의 서브 클래스로의 유형을 T 제약 조건해야합니다 그런데

public class DatabaseAccess<T extends Student> { 
    // ... 
} 

, 경우 대신 Student 클래스가 Comparable<Student> 클래스로 구현하면 compareTo 메소드를 작성하는 것이 쉬울 것입니다.

+0

두 클래스를 확장 할 수 있습니까? 두 가지 클래스가 있기 때문에 학생들과 비슷한 학생들과 푸드 클래스의 메소드에 액세스해야합니다. –

+0

'Student'와 'Food'가 동일한 인터페이스를 구현하도록 만들 수 있습니까? 사용하려는 모든 방법이 있습니까? 그런 다음 그 인터페이스를'T'의 범위 내에서 사용하십시오. –

+0

나는 그렇게 생각하지 않는다 : ( –