2013-05-18 29 views
8

Tôi vẫn còn khá mới với Java, vì vậy tôi có thể thiếu một cái gì đó hiển nhiên ở đây.Chuyển loại lớp sang phương thức, sau đó truyền tới loại đó?

Tôi có đoạn code sau đây mà tôi sử dụng để chọn loại lớp từ một danh sách của tất cả các đơn vị của tôi:

public Array<?> PickEntities(Class<?> cls) { 
    Array<? super SpriteEntity> allEntities = new Array<Object>(); 
    for (SpriteEntity entity : MyGame.AllEntities) { 
     if (entity.getClass() == cls) { 
       allEntities.add(entity); 
     } 
    } 
    return allEntities; 
} 

đó làm việc tốt, nhưng nó có nghĩa là khi gọi phương pháp này tôi vẫn cần phải cast nó để lớp ở phía bên kia. Ví dụ:

asteroid = (Asteroid)PickEntities(Asteroid.class); 

Những gì tôi muốn làm là sử dụng lớp tôi đi qua để lớp PickEntities tôi (tham số cls) và sau đó đúc mảng trở về (allEntities) để rằng loại.

Có cách nào để thực hiện việc này không? Bất cứ khi nào tôi thử nó chỉ nói với tôi rằng 'cls' không phải là một loại và không thể được sử dụng để đúc.

+0

Mảng lớp được xác định ở đâu? – Antimony

Trả lời

14

phương pháp của bạn nên được generic:

public <T extends SpriteEntity> List<T> pickEntities(Class<T> clazz) { 
    List<T> result = new ArrayList<T>(); 
    for (SpriteEntity entity : MyGame.allEntities) { 
     if (entity.getClass() == clazz) { 
      result.add((T) entity); 
     } 
    } 
    return result; 
} 

Lưu ý rằng tôi đã sử dụng các lớp học tập tiêu chuẩn, và ước Java đặt tên tiêu chuẩn.

+0

Ồ, đó là một số mã tuyệt vời! Hoạt động hoàn hảo, và tôi đã có một bài học về cách sử dụng tốt hơn Java: D Cảm ơn bạn đời! – boolean

+1

Lưu ý rằng đoạn mã trên, giống như mã từ OP, sẽ chỉ bao gồm các trường hợp mà lớp đó chính xác giống như 'clazz'; nó sẽ không bao gồm các lớp con. Ngoài ra, bạn có thể tránh các diễn viên bằng cách gọi 'clazz.cast (thực thể)' – NamshubWriter

Các vấn đề liên quan