Tôi muốn viết mã Java tương đương của mã C#.Java: Tạo đối tượng có loại là thông số loại
Mã của tôi C# như sau:
public abstract class A<T> where T : A<T>, new()
{
public static void Process()
{
Process(new T());
}
public static void Process(T t)
{
// Do Something...
}
}
public class B : A<B>
{
}
public class C : A<C>
{
}
Java tương đương với mã của tôi trông như thế này.
public abstract class A<T extends A<T>>
{
public static <T extends A<T>> void process()
{
process(new T()); // Error: Cannot instantiate the type T
}
public static <T extends A<T>> void process(T t)
{
// Do Something...
}
public class B extends A<B>
{
}
public class C extends A<C>
{
}
}
Ở đây, cú pháp "mới()" trong lớp khai báo lớp khởi tạo để viết cấu trúc mặc định có thể gọi là "mới T()" từ lớp cơ sở. Nói cách khác khi tôi đang wrting lớp cơ sở tôi chắc chắn rằng lớp dẫn xuất sẽ có một constructer mặc định, để tôi có thể khởi tạo một đối tượng lớp dẫn xuất từ lớp cơ sở.
Vấn đề của tôi trong Java là, tôi không thể khởi tạo đối tượng lớp dẫn xuất từ lớp siêu. Tôi gặp lỗi "Cannot instantiate the type T"
cho cuộc gọi "new T()"
. Có cách nào tương tự C# trong Java hay tôi nên sử dụng một cái gì đó giống như mẫu thử nghiệm và nhân bản?
Cảm ơn bạn đã trả lời nhanh. Vì tôi đang cố gắng tạo một cá thể mới bên trong một phương thức tĩnh, tôi không thể thực hiện một cuộc gọi getClass(). Bên cạnh đó T.class không tồn tại beacuse xây dựng thời gian biên dịch. Vì vậy, phản ánh dường như không phải là một giải pháp cho tôi. Hoặc tôi không thể tìm thấy nó (: –
Điều này sẽ chỉ hoạt động nếu lớp con sử dụng tham số kiểu cụ thể. Nếu lớp con là 'public class B mở rộng A ' ví dụ, điều này sẽ có cùng một vấn đề chính xác. tốt hơn để sử dụng các loại thẻ nhưng yêu cầu người gọi chuyển mã thông báo vào hàm tạo hoặc phương thức. –