2016-08-04 4 views
3

List<A>을 반환하는 메서드가있는 일반 인터페이스 (Pack<A extends PackAnimal>)가 있습니다. 오늘은 인터페이스가 나는 클래스를 speficy하는 것을 잊지 구현하는 클래스에 (class XXX implements PackAnimal) 반환 형식은 컴파일 시간에 확인하고 있지 않은 경우 목록을 반환하는 메서드가있는 일반 인터페이스

interface PackAnimal { 
} 
class Buffalo implements PackAnimal { 
} 

interface LonelyAnimal { 
} 
class Puma implements LonelyAnimal { 
} 

interface Pack<A extends PackAnimal> { 
    List<A> getMembers(); 
} 

class PumaPack implements Pack { 

    @Override 
    public List<Puma> getMembers() { 
     return null; 
    } 
} 

이유는 무엇입니까 실행

중 실패한 것으로 나타났습니다? 선언문에 어떤 유형의 실수라도 컴파일이 실패하면 어떻게 강제 할 수 있습니까?

답변

1

Raw Types을 사용하여 무서운 결과를 얻었습니다.

<...> 어디서든 컴파일러가 코드를 레거시로 취급하고 정상적인 유형 검사를 많이 수행하지 않아야합니다. MOst 컴파일러는 최선을 다하지만 검사 과정에서 큰 결함을 남깁니다.

interface PackAnimal { 
} 

class Buffalo implements PackAnimal { 
} 

interface LonelyAnimal { 
} 

class Puma implements LonelyAnimal { 
} 

interface Pack<A extends PackAnimal> { 
    // Obviously fine. 
    List<A> getMembers(); 
} 

// Raw type so no checking. 
class PumaPack implements Pack { 

    @Override 
    public List<Puma> getMembers() { 
     // Raw typed class so Puma isn't checked for PackAnimal super. 
     return Arrays.asList(new Puma()); 
    } 
} 

class Six { 

} 

// Properly typed so Raw Types not happening. 
class SixPack implements Pack<Six> { 

    @Override 
    // NOT ALLOWED: Attempt to use incompatible return type!!! 
    public List<Six> getMembers() { 
     return null; 
    } 
} 
+0

좋은데, 원시 타입을 비활성화하는 플래그가 있습니다. http://stackoverflow.com/questions/697879/javac-flag-to-disallow-raw-types – Narkha

2

귀하의 목록은 알 수없는 유형으로 선언되었습니다.

// compile warning 
class PumaPack implements Pack { 
    List getMembers() {return null;} 
} 
: 그러나 당신이 컴파일러 경고를 얻을 것이다,

interface Pack<A extends PackAnimal> { 
    List<A> getMembers(); 
} 

// won't compile because Puma not within bound 
class PumaPack implements Pack<Puma> { 
    List<Puma> getMembers() {return null;} 
} 

// compiles OK 
class BuffaloPack implements Pack<Buffalo> { 
    List<Buffalo> getMembers() {return null;} 
} 

그러나 당신은 당신의 PumpPack의 예와 같은 원시 (없는 타입) 구현을 코딩 사람을 멈출 수 없다 : 클래스 유형을 사용

경고가있는 경우 컴파일을 실패로 설정하면 다음을 수행합니다.

javac -Werror ... 

원시 타입을위한 우리의 목표.

+0

은 또한 컴파일 : https://ideone.com/Gzr9tp – Narkha

+0

@nark 것이란 내 편집 대답 – Bohemian

+0

을 내 테스트에서는 팩'과 단지 경고를 컴파일 오류가 발생, 그리고 ' – 4castle

관련 문제