2015-05-12 23 views
11

Tôi không thể hiểu tại sao method2 không biên dịch trong khi method1 biên dịch. Tôi đang sử dụng Eclipse với JavaSE 1,7 và tôi đã nhận lỗi sau trên method2:Tại sao <T mở rộng Enum <T> & SomeInterface> biên dịch, nhưng không <T mở rộng SomeInterface & Enum <T>>?

Multiple markers at this line

  • The type Enum<T> is not an interface; it cannot be specified as a bounded parameter

  • Bound mismatch: The type T is not a valid substitute for the bounded parameter <E extends Enum<E>> of the type Enum<E>

public class Test { 

    public interface SomeInterface { 

    } 

    public static <T extends Enum<T> & SomeInterface> T method1() { 
     return null; 
    } 

    public static <T extends SomeInterface & Enum<T>> T method2() { 
     return null; 
    } 
} 

Trả lời

16

Nếu bạn nhìn vào cú pháp cho loại giới hạn tham số trong JLS 8.1.2 bạn sẽ thấy:

TypeBound: 
    extends TypeVariable 
    extends ClassOrInterfaceType {AdditionalBound} 

AdditionalBound: 
    & InterfaceType 

Nói cách khác, chỉ có loại đầu tiên được chỉ định có thể là một lớp - tất cả phần còn lại phải là giao diện.

Ngoài bất cứ điều gì khác, điều này ngăn cản nhiều lớp được chỉ định.

Nó cũng phản ánh cách mà khi khai báo một lớp, bạn phải đặt lớp mở rộng trước, sau đó các giao diện nó thực hiện - không phải theo cách khác.

+5

bị đánh đập bởi giây. * Skeet! * \ * Lắc nắm tay * – Radiodef

5

Theo docs:

A type variable with multiple bounds is a subtype of all the types listed in the bound. If one of the bounds is a class, it must be specified first. For example:

Class A { /* ... */ } 
interface B { /* ... */ } 
interface C { /* ... */ } 

class D <T extends A & B & C> { /* ... */ } 

If bound A is not specified first, you get a compile-time error:

class D <T extends B & A & C> { /* ... */ } // compile-time error 

Vì trong ví dụ của bạn method2 có giao diện SomeInterface đầu tiên, nó cho thấy trình biên dịch lỗi

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