2012-04-04 37 views
6

thể trùng lặp:
Java generics constraint require default constructor like C#hạn chế trong việc thực hiện giao diện trong java

Tôi muốn thiết lập một hạn chế gõ T rằng nó phải có một constructor không có tham số. Trong C# nó sẽ giống như:

public interface Interface<T> where T : new() { }

Tính năng này có sẵn trong Java không?

Cập nhật: Có mẹo nào để làm cho loại chung T có một hàm tạo không?

+0

Câu hỏi hài hước về giao diện java ... Giao diện với hàm tạo .. :) –

Trả lời

1

Trả lời câu hỏi cập nhật của bạn: chỉ lớp có thể có một constructor trong Java, T - là một loại đen, nó không phải là cần thiết đã đến là một lớp. Trong suốt thời gian chạy sử dụng sự phản chiếu, bạn có thể kiểm tra xem lớp của bạn là một lớp ParameterizedType có tham số thực sự là một lớp và nếu nó có một hàm tạo rỗng.

5

Bạn không thể xác định giao diện cho các hàm tạo trong Java. Bạn cũng không thể đặt bất kỳ ràng buộc nào khác để nhập các tham số, ngoại trừ phương sai kiểu.

+0

Chỉ cần nói điều này ... = D –

+7

** Hiểu sai ** Điều này định nghĩa hàm tạo cho kiểu chung T và không phải giao diện. – Aliostad

0

Bạn không thể thực hiện việc này tại thời gian biên dịch trong Java. Tôi nghĩ rằng tốt nhất bạn có thể làm là cố gắng xác minh điều này trong thời gian chạy, bằng cách sử dụng phản ánh để làm một cái gì đó như:

public static <T> boolean hasDefaultConstructor(Class<T> cls) { 
    Constructor[] constructors = cls.getConstructors(); 
    for (Constructor constructor : constructors) { 
     if (constructor.getParameterTypes().length == 0) { 
      return true; 
     } 
    } 

    return false; 
} 

Sau đó, bạn có thể gọi chức năng này bằng cách làm như sau:

hasDefaultConstructor(String.class) => true; 
hasDefaultConstructor(Integer.class) => false; 

Nếu hàm này trả về false, thì bạn biết rằng lớp sẽ không có hàm tạo mặc định và bạn có thể ném một ngoại lệ hoặc bất kỳ điều gì thích hợp cho ứng dụng của bạn.

0

Bạn có thể làm cho T mở rộng một lớp học với các nhà xây dựng bạn muốn

public interface Interface<T extends Constructable>{} 

public abstract class Constructable{ 
    public Constructable(params..){ 
    } 
} 
+0

Nhưng lớp kế thừa Constructable có thể không có hàm tạo mặc định (không có tham số). – ahanin

+0

tất nhiên là có, khi kế thừa bạn không thể giảm phạm vi của công cụ sửa đổi truy cập. Nếu lớp cha có một hàm tạo công khai không có tham số, thì tất cả các lớp con sẽ có hàm tạo này mà không có tham số –

+1

Thực ra, điều này không đúng. Nó không liên quan gì đến các công cụ sửa đổi truy cập. Tập hợp các hàm tạo là duy nhất cho mỗi lớp cụ thể. Bạn phải gọi một trong số các hàm tạo siêu trong mọi constructor của một lớp con, trừ khi cha mẹ có hàm tạo mặc định. Giả sử B là một sublcass của A. A có một constructor mặc định. Nếu bạn chỉ xác định hàm tạo B (String) trong B, thì bạn sẽ không thể khởi tạo B chỉ với B mới(). – ahanin

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