2016-08-09 14 views
6

[Kiểm tra dưới cùng của câu hỏi cho bản cập nhật]Java - Vượt qua một phương pháp để một lớp học và thực hiện nó trong một bài viết mới

Như trong tiêu đề, tôi muốn viết một lớp mà mất trong một phương thức và thực thi nó trong một Thread mới. Tôi lẩn quất quanh SO và đã đưa ra một cái gì đó như:

import java.util.concurrent.Callable; 

public class MyExecutor<T> implements Runnable{ 

    private Callable<T> method; 


    public <T> MyExecutor(Callable<T> pMethod){ 
     this.method = pMethod; 
    } 

    @Override 
    public void run() { 
     try { 
      // start a new Thread, then 
      method.call(); 
     } catch (Exception e) { 
      System.err.println("Failed calling method "+method.getClass()); 
      e.printStackTrace(); 
     } 

    } 

} 

Tuy nhiên Eclipse cảnh báo tôi rằng, bên trong constructor, trong

this.method = pMethod; 

tôi cannot convert from Callable <T> to Callable <T>.

Có mùi như tôi đang làm điều gì đó hoàn toàn sai, nhưng tôi không thể hiểu được.

CẬP NHẬT

Hóa ra tôi đã reinventing the wheel, những gì tôi muốn làm có thể đạt được như thế này:

public class MyExecutor implements Executor{ 


    @Override 
    public void execute(Runnable command) { 
     new Thread(command).start(); 
    } 

} 

Trong dòng chảy chính là một phương pháp có thể được thực hiện trong một chủ đề mới như thế này:

MyExecutor myExec = new MyExecutor(); 

    myExec.execute(new Runnable() { 

     @Override 
     public void run() { 
      myMethod(); 
     } 
    }); 
+0

bạn không thể chuyển các phương thức cho các lớp khác. bạn có thể chuyển các thể hiện của các phương thức mà bạn có thể gọi các phương thức – Stultuske

+2

Bạn đã thử xóa ở phía trước của hàm tạo không? – dasblinkenlight

+3

'' trước khi hàm tạo của bạn khai báo kiểu chung thứ hai, còn được gọi là 'T'. Nếu bạn xóa nó, mã của bạn sẽ ổn. – khelwood

Trả lời

6

Vì bạn thêm một tham số kiểu <T> đến constructor của bạn, nó bóng tối kiểu pa tham số cho lớp. Do đó, T cho đối số hàm tạo pMethod là một khác nhau T so với tham số lớp, đó là những gì Eclipse cảnh báo bạn. Chỉ cần thay đổi chữ ký cho hàm tạo thành public MyExecutor(...).

+0

Cảm ơn bạn, bạn đã đúng. Vì chúng ta ở đây, chính ý tưởng đó (truyền một phương thức cho lớp, tạo ra một luồng bên trong lớp chung của tôi và thực hiện phương thức của tôi) có ý nghĩa không? Có thực hành tốt không? Đánh dấu là giải pháp anyway. – Tom

+5

@Tom Bạn đang phát minh lại bánh xe về cơ bản. JDK đã có các phần tử thực thi, cung cấp cho bạn chức năng (và nhiều hơn nữa, với 'Tương lai' và những thứ khác). Ít nhất bạn biết rằng ý tưởng của bạn là đủ hợp lệ để bao gồm trong thời gian chạy;) – Kayaman

+0

Như Kayaman nói - không chỉ là nó thực hành hợp lệ, nó đã được thực hiện. Bạn có thể muốn xem xét phân cấp 'java.util.concurrent.Executor'. –

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