0 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)
ویرایش شده قبل توسط

یک متد دارم که بعنوان پارامتر یک Supplier میگیرد:

public <T> T withTransaction(String name, boolean readOnly, Supplier<T> block);

و از طرف دیگر یک شئ از یک کلاس دارم که متدی با نام proceed دارد که امضای متد proceed شبیه به Supplier است فقط در امضای آن امکان پرتاب یک نوع checked exception تعریف شده است:

Object proceed() throws Throwable;

حالا وقتی می خواهم با استفاده از قابلیت method reference در جاوا 8 عبارت lambda تولید شده از متد proceed را به متد withTransaction بفرستم به خطای زیر بر می خورم:

withTransaction(service.dsName, readOnly, invocation::proceed);

پیغام خطا:

incompatible thrown types java.lang.Throwable in method reference

1 پاسخ

0 امتیاز
قبل توسط (1.1هزار امتیاز)

بدلیل تعریف پرتاب یک نوع checked exception در امضای متد proceed، نمی توان آن را از نوع Supplier فرض کرد و نوع آن از دید کامپایلر با Supplier فرق می کند. یکی از راه ها برای حل این مشکل ساختن یک Supplier جدید که در آن به exception رسیدگی شده یا به یک unchecked exception تبدیل شده است می باشد:

Supplier<Object> supplier =
                () -> {
                    try {
                        return invocation.proceed();
                    }
                    catch(Throwable e) {
                        throw new RuntimeException(e);
                    }
                };

حالا می توان متغییر supplier را به متد withTransaction ارسال کرد.

سوالات مشابه

0 امتیاز
0 پاسخ 605 بازدید
+1 امتیاز
1 پاسخ 1.2هزار بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
+1 امتیاز
1 پاسخ 451 بازدید
+2 امتیاز
1 پاسخ 955 بازدید
+1 امتیاز
1 پاسخ 409 بازدید
0 امتیاز
1 پاسخ 934 بازدید
+1 امتیاز
1 پاسخ 1.2هزار بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
...