Tôi đang cố gắng bảo toàn thông tin kiểu chung từ kiểu trả về của biểu thức lambda trên một số hàm bậc cao hơn trong Java 8. Tôi đã đơn giản hóa mã thực của tôi xuống thử nghiệm này trường hợp. Vấn đề không phải là những gì tôi mong đợi mã để làm chính xác, nhưng thay vì tôi mong đợi các loại chung (s) R
được suy ra như java.lang.String
và thực hiện thông qua các cuộc gọi chức năng.Java 8 - Suy ra kiểu trả về chung với lambdas
import java.util.function.Function;
public class AdamTest {
public final static void main(final String args[]) {
final AdamTest adamTest = new AdamTest();
final String s = adamTest.thing2(7).apply(i -> i.toString());
System.out.println(s);
}
private <R> R fn1(final Function<Integer, R> op) {
return op.apply(10);
}
private <R> Function<Function<Integer, R>, R> thing2(final Integer val) {
return fn1(i -> new Function<Function<Integer, R>, R>() {
@Override
public R apply(Function<Integer, R> op) {
return op.apply(val * i);
}
}
);
}
}
Hiện tại mã này không biên dịch vì dòng này final String s = adamTest.thing2(7).apply(i -> i.toString());
. Tôi nghĩ rằng tôi có một cái gì đó tinh tế sai với giới hạn loại của tôi, như trình biên dịch dường như không thể suy ra kiểu trả về của thing2(7).apply
và báo cáo Object
thay vì String
mà tôi đã hy vọng.
Làm thế nào để giới hạn loại generic chính xác để các kiểu trả về đúng nghĩa java.lang.String
được suy bởi trình biên dịch?
Bạn có thể thêm lỗi bạn đang nhận được không? –
Trình biên dịch "đánh giá" biểu thức từ trái sang phải; Vấn đề xảy ra tại 'adamTest.thing2 (7)'. Trình biên dịch không nhìn vào '.apply' để tìm ra kiểu, và nếu không có nó thì không thể. –
Bạn đang cố gắng làm gì chính xác? Điều này là hoàn toàn không rõ ràng. – fge