tôi có ở đây một lớp Handler
, mà là vụ phải xử lý Event
s của một loại nhất định:Có cách nào để xác định kiểu tham số chung một cách rõ ràng trong biểu thức lambda không?
public interface Handler<E extends Event>
{
public void handle(E event);
@SuppressWarnings("unchecked")
public default Class<E> getEventType()
{
for(Method method: this.getClass().getDeclaredMethods())
{
if(method.getName().equals("handle")) return (Class<E>)method.getParameterTypes()[0];
}
throw new NullPointerException("Couldn't find the 'handle' method in this handler.");
}
}
Như bạn có thể thấy, nó sẽ cố gắng, theo mặc định, để có được những loại Event
bằng cách quay đầu tiên loại tham số của phương thức handle()
bất cứ khi nào bạn thực hiện getEventType()
(ngược với Handler
trả về một cách rõ ràng). Này hoạt động một cách chính xác với các thử nghiệm JUnit sau:
public static class EmptyEvent extends Event
{
public void test() { }
}
public static Handler<EmptyEvent> genericHandler = new Handler<EmptyEvent>()
{
@Override
public void handle(EmptyEvent event)
{
}
};
@Test
public void testEventGenerics()
{
//prints the name of EmptyEvent
System.out.println(genericHandler.getEventType());
}
Intellij IDEA nói với tôi rằng tôi có thể đơn giản hóa genericHandler
để một biểu thức lambda, vì vậy tôi làm điều đó:
public static class EmptyEvent extends Event
{
public void test() { }
}
public static Handler<EmptyEvent> genericHandler = event -> { };
@Test
public void testEventGenerics()
{
//prints the name of the base Event class
System.out.println(genericHandler.getEventType());
}
Tuy nhiên, các thử nghiệm in ra tên của Event
, không phải EmptyEvent
.
Vì vậy, câu hỏi của tôi là, Có cách nào để xác định rõ ràng loại tham số chung của một biểu thức lambda không?
Tôi đã cố gắng làm một cái gì đó như thế này, nhưng nó không làm bất cứ điều gì (còn nó là một lỗi)
public static Handler<EmptyEvent> genericHandler = (EmptyEvent)event -> { };
Hmm. Nó biên dịch và điều này trả lời câu hỏi, nhưng vì lý do nào đó 'genericHandler.getEventType()' vẫn trả về tên của 'Event'. Bạn có ý kiến gì không? – octopod
@Octopod có thể vì bạn đang dựa vào thứ tự mà các phương thức khác nhau được trả về bởi 'getDeclaredMethods', đó là một số không. – immibis
@immibis ngoại trừ việc tôi khá chắc chắn rằng chỉ có một phương thức 'handle()' (cái tôi đã định nghĩa), không có ở đó? Bạn có nói rằng cũng có một 'xử lý (sự kiện)' quá? – octopod