2010-05-17 31 views
5

Tôi rất mới với ngôn ngữ lập trình Java nên đây có lẽ là câu hỏi ngớ ngẩn nhưng tôi phải hỏi nó vì tôi không thể tự mình tìm ra nó. Đây là thỏa thuận.Cách tạo phương thức có chữ ký là Danh sách

Tôi muốn tạo phương thức trích xuất loại đối tượng nhất định từ danh sách. Vì vậy, phương thức này sẽ nhận được danh sách là đối số, có nghĩa là danh sách phải chứa cả Object1 hoặc Object2. Tôi đã cố gắng như thế này:

public Object1 extractObject(List<Object>){ 
    //some pseudo-code 
    ... loop trough list and check if list item is instance of object one return that instance 
    } 

Vấn đề với phương pháp khai báo với List<?> như là đối số phương pháp là tôi nhận lỗi biên dịch từ nhật thực Syntax error on token ">", VariableDeclaratorId expected after this token.

Làm cách nào để đặt chữ ký phương thức đúng cách để chấp nhận loại đối tượng hoặc Object1 hoặc Object2? Cảm ơn bạn

Đây là Mã của tôi:

protected Object1 getObject1(List<Object> list){ 
     for(Object obj : list) { 
      if(obj instanceof Object1) { 
       return (Object1) obj; 
      } 
     } 
     return null; 
    } 

Edit - sự khác biệt giữa các 2 là gì:

public Object1 getObject1(List<Object> list){ 
     for(Object obj : list) { 
      if(obj instanceof Object1) { 
       return (Object1) obj; 
      } 
     } 
     return null; 
    } 

public Object1 extractObject(List<Object> list, Class<Object1> type) { 
    for(Object obj : list) { 
     if(type.isInstance(obj)) { 
      return (Object1)obj; 
     } 
    } 
    return null; // no match found 
} 

Trả lời

3
public Object1 extractObject(List<?> list){ 
    //some pseudo-code 
    ... loop trough list and check if list item is instance of object one return that instance 
    return null; 
} 

Bạn cần một biến ví dụ của bạn

Và trở lại.

+0

chụp hình này là: D – London

+0

là ok với tính năng đúc bổ sung, nó sẽ không biên dịch theo cách khác – London

+0

@London, bình thường là bạn cần Truyền, bạn không vượt qua loại Lớp Danh sách của bạn. –

1

Tôi sẽ làm một cái gì đó như thế này - lưu ý, cú pháp của tôi có thể sai, nhưng ý tưởng là như nhau.

// this works for any type - just pass in an Object1 
public Object extractObject(List<?> list, Class clazz) { 
    for(Object obj : list) { 
     if(obj.getClass().equals(clazz) { 
      return obj; 
     } 
    } 
    return null; // no match found 
} 

Và không chung chung:

// this works for just one type 
public Object1 extractObject(List<?> list) { 
    for(Object obj : list) { 
     if(obj.getClass().equals(Object1) { 
      return obj; 
     } 
    } 
    return null; // no match found 
} 

Tested các khái niệm với trình điều khiển này:

public static void main(String[] args) { 
    Class c = "".getClass(); 
    if("".getClass().equals(c)) System.out.println("true"); 
    else System.out.println("false"); 
} 

Từ các ý kiến, xem xét clazz.isAssignableFrom(otherClazz) là tốt.

+0

@glowcoder là ok với đúc bổ sung nó sẽ không biên dịch theo cách khác – London

+0

Trong đoạn đầu tiên - bạn có thể làm 'obj instanceof clazz' và nếu nó hoạt động như dự định? Trên đỉnh đầu của tôi, tôi đã nghĩ bạn cần 'clazz.isAssignableFrom (obj)'. –

+0

@glowcoder: -1 vì bạn không thể làm 'obj instanceof [đối tượng Lớp]'. Điều này là không thể. Bạn phải làm một cái gì đó như 'if (clazz.isInstance (obj))' PS: 'instanceof' là hai lần với một ký tự chữ thường. –

1

Khi bạn đang sử dụng Generics, bạn có thể làm

public <T> T extractObject(List<?> list, Class<T> type) { 
    for(Object obj : list) { 
     if(type.isInstance(obj)) { 
      return (T)obj; 
     } 
    } 
    return null; // no match found 
} 

này sẽ làm cho kiểu trả về của phương pháp của bạn giống như các loại mà bạn đang tìm kiếm.

Nhờ Generics, chúng ta có thể sử dụng cùng một phương pháp để giải nén các loại khác nhau của các đối tượng:

Object1 object1 = extractObject(list, Object1.class); 
Object2 object2 = extractObject(list, Object2.class); 

này được ưa thích để cứng mã hóa việc kiểm tra loại bằng cách sử dụng obj instanceof Object1 kể từ khi làm điều đó sẽ dẫn đến việc cần một riêng biệt phương thức cho mỗi loại, tất cả chúng hầu như giống hệt với kiểu trả về và kiểm tra instanceof.

+0

hãy xem bản chỉnh sửa của tôi – London

+0

Sự khác biệt là bạn có thể sử dụng phương pháp này để truy xuất cả hai loại. Khi bạn hardcode kiểm tra cá thể thông qua instanceof, thay vì Class.isInstance, bạn chỉ có thể trả về một kiểu. Xem chỉnh sửa của tôi. – mdma

0

Sự khác biệt giữa hai không là gì cả. Theo javadoc, This method is the dynamic equivalent of the Java language instanceof operator.

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