2009-04-19 40 views
121

Điều này có thể đã được hỏi trước đó, nhưng tìm kiếm nhanh chỉ đưa ra cùng một câu hỏi được yêu cầu cho C#. See here.Kiểm tra xem đối tượng có thực hiện giao diện

Điều cơ bản tôi muốn làm là kiểm tra thời tiết một đối tượng cụ thể thực hiện một giao diện nhất định.

Tôi đã tìm ra giải pháp nhưng điều này không đủ thoải mái để sử dụng nó thường xuyên trong các câu lệnh if hoặc case và tôi đã tự hỏi rằng Java không có giải pháp tích hợp.

public static Boolean implementsInterface(Object object, Class interf){ 
    for (Class c : object.getClass().getInterfaces()) { 
     if (c.equals(interf)) { 
      return true; 
     } 
    } 
    return false; 
} 


EDIT: Ok, cảm ơn câu trả lời của bạn. Đặc biệt là Damien Pollet và Noldorin, bạn đã làm cho tôi suy nghĩ lại về thiết kế của mình vì vậy tôi không kiểm tra giao diện nữa.

+3

thể bạn không chỉ cần cố gắng đúc và bắt ngoại lệ nếu một được ném (hoặc kiểm tra một kết quả null thậm chí, nếu Java có bất cứ điều gì analagous đến C# "như" nhà điều hành)? Tôi là một coder C# chứ không phải là một Java, vì vậy tôi chủ yếu chỉ đoán ở đây, mặc dù tôi sẽ nghĩ rằng một cách tiếp cận như vậy sẽ có thể trong bất kỳ ngôn ngữ OO. – Noldorin

+0

yay! bạn được chào đón :) –

+0

Trường hợp ngoại lệ ném là thực tiễn tốt trong trường hợp này chỉ khi bạn không phải quan tâm đến hiệu suất. – Rafa

Trả lời

159

Nhà điều hành instanceof hiện các công việc một cách an toàn NullPointerException. Ví dụ:

if ("" instanceof java.io.Serializable) { 
    // it's true 
} 

cho kết quả đúng. Kể từ:

if (null instanceof AnyType) { 
    // never reached 
} 

sản lượng sai, nhà cung cấp instanceof không an toàn (mã bạn đã đăng không).

instanceof là built-in, thời gian biên dịch an toàn thay thế cho Class#isInstance(Object)

+4

instanceof chỉ hoạt động trên lớp học chữ mặc dù. Vì vậy, nó không thể được sử dụng trong trường hợp OP – LordOfThePigs

+0

chắc chắn, nó là thời gian biên dịch an toàn; và nó được xây dựng trong cách và nó là đối số của câu hỏi (imho) – dfa

+0

@LordOfThePigs không có nó không. Nó sẽ kiểm tra nếu một giao diện được thực hiện tốt. – NimChimpsky

40

này nên làm:

public static boolean implementsInterface(Object object, Class interf){ 
    return interf.isInstance(object); 
} 

Ví dụ,

java.io.Serializable.class.isInstance("a test string") 

đánh giá để true.

+1

+1 này - nó sẽ không thất bại nếu đối tượng là null – msangel

3

đó là dễ dàng:

interf.isInstance(object) 
7

tôi thích instanceof:

if (obj instanceof SomeType) { ... } 

đó là phổ biến hơn nhiều và dễ đọc hơn SomeType.isInstance(obj)

+3

Hãy nhớ rằng 'if (obj instanceof SomeType) {...}' là tĩnh (nghĩa là - nó không thể thay đổi khi chạy) và 'SomeType.isInstance (obj)' là động. –

2

Nếu bạn muốn kiểm tra giao diện:

public List<myType> getElement(Class<?> clazz) { 
    List<myType> els = new ArrayList<myType>(); 
    for (myType e: this.elements.values()){ 
     if (clazz.isAssignableFrom(e.getClass()) == true){ 
      els.add(e); 
     } 
    } 
    return els; 

}

clazz là một Giao diện và myType là Tyoe mà bạn đã xác định có thể triển khai một số giao diện. Với mã này, bạn chỉ nhận được các loại mà thực hiện một giao diện định nghĩa

0

với ArrayUtils Apache commons-lang, xem giao diện bạn cần được chứa trong các giao diện của quý vị phản đối

public static Boolean implementsInterface(Object object, Class interf){ 
    return ArrayUtils.contains(object.getClass().getInterfaces(), interf); 
} 
1

Tôi có vấn đề này tối nay với android và sau khi xem xét các giải pháp javadoc, tôi đã đưa ra giải pháp làm việc thực sự này chỉ dành cho những người như tôi cần nhiều hơn một lời giải thích javadoc.

Đây là ví dụ làm việc với giao diện thực tế sử dụng java android. Nó kiểm tra hoạt động được gọi là triển khai giao diện AboutDialogListener trước khi cố gắng truyền trường AboutDialogListener.

public class About extends DialogFragment implements OnClickListener, 
    OnCheckedChangeListener { 

public static final String FIRST_RUN_ABOUT = "com.gosylvester.bestrides.firstrunabout"; 


public interface AboutDialogListener { 
    void onFinishEditDialog(Boolean _Checked); 
} 

private AboutDialogListener adl; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    Activity a = this.getActivity(); 
    if (AboutDialogListener.class.isInstance(a)) { 
     adl = (AboutDialogListener) a; 
     } 
} 

... Sau đó tôi kiểm tra xem ADL lĩnh vực là! Null trước khi gọi giao diện

@Override 
public void onStop() { 
    super.onStop(); 
    sharedPref.edit().putBoolean(About.FIRST_RUN_ABOUT, _Checked).commit(); 
    // if there is an interface call it. 
    if (adl != null) { 
     adl.onFinishEditDialog(is_Checked()); 
    } 
} 
Các vấn đề liên quan