Câu trả lời được chấp nhận cho this question mô tả cách tạo một phiên bản T
trong lớp Generic<T>
. Điều này liên quan đến việc truyền tham số Class<T>
tới hàm tạo Generic
và gọi phương thức newInstance
từ đó.Làm cách nào để nhận thuộc tính `.class` từ thông số loại chung?
Một ví dụ mới của Generic<Bar>
sau đó được tạo ra, và tham số Bar.class
được thông qua vào.
Bạn làm gì nếu tham số kiểu chung chung cho các lớp mới Generic
không phải là một số lớp tiếng như Bar
nhưng bản thân nó là một loại thông số chung? Giả sử tôi có một số lớp khác Skeet<J>
và tôi muốn tạo một cá thể mới là Generic<J>
từ bên trong lớp đó. Sau đó, nếu tôi cố gắng vượt qua trong J.class
Tôi nhận được lỗi trình biên dịch sau:
cannot select from a type variable.
Có cách nào khác không?
Các bit cụ thể của mã kích hoạt các lỗi đối với tôi là:
public class InputField<W extends Component & WidgetInterface>
extends InputFieldArray<W>
{
public InputField(String labelText)
{
super(new String[] {labelText}, W.class);
}
/* ... */
}
public class InputFieldArray<W extends Component & WidgetInterface>
extends JPanel
{
/* ... */
public InputFieldArray(String[] labelText, Class<W> clazz)
throws InstantiationException, IllegalAccessException
{
/* ... */
for (int i = 0 ; i < labelText.length ; i++) {
newLabel = new JLabel(labelText[i]);
newWidget = clazz.newInstance();
/* ... */
}
/* ... */
}
/* ... */
}
Các lỗi xảy ra, bởi vì tôi không thể viết W.class
. Có cách nào khác để vượt qua trong cùng một thông tin không?
Câu hỏi của bạn có thể rõ ràng hơn nếu bạn viết mã ví dụ (tức là trình kích hoạt lỗi trình biên dịch). –
Nhưng bạn phải có tên lớp trong 'Skeet 'phải không? Bạn cần phải chuyển lớp đó tới hàm tạo 'Generic'. Nếu bạn hiển thị mã thực tế, chúng tôi có thể giúp bạn tốt hơn. –
bạn không thể sử dụng 'J.class' vì [type erasure] (http://stackoverflow.com/questions/tagged/type-erasure). Nhưng bạn có thể nhận được biến 'Class' cụ thể trên' Skeet 'xây dựng –
RiaD