2012-05-11 5 views
1

: 재정의 유형 매개 변수

public class DwellingPropertySetter 
    extends AbstractPropertySetter<Dwelling> 

public class HousePropertySetter 
    extends DwellingPropertySetter<House> 

public class SkyscrapperPropertySetter 
    extends HousePropertySetter<Skyscrapper> 

불행하게도이 코드는 컴파일되지 않습니다. 그것을 할 수있는 방법이 될 것입니다 :

public class DwellingPropertySetter<T extends Dwelling> 
    extends AbstractPropertySetter<T> 

public class HousePropertySetter<T extends House> 
    extends DwellingPropertySetter<T> 

public class SkyscrapperPropertySetter<T extends Skyscrapper> 
    extends HousePropertySetter<T> 

하지만 나를 위해 그 extends 키워드는 필요하지 않습니다. SkyscrapperPropertySetter을 사용할 때마다 형식 매개 변수를 지정해야합니다. 이것은 쓸모 없으며 SkyscrapperPropertySetter<Skyscraper>처럼 보일 것입니다.

나를 위해 길을 알고 있습니까? 첫 번째 계층 구조를 실현하는 유일한 방법은 인터페이스를 사용하고 메소드를 위임하는 것입니다.

+1

첫 번째 예제가 필요한 것을 수행 할 때 왜 두 번째 예제와 같은 제네릭을 사용하고 싶습니까? – assylias

+0

첫 번째 예제가 컴파일되지 않기 때문에. :-) –

+0

하하 - 충분히 공정해! – assylias

답변

2

난 당신이 정확하게 당신이 할 수있다,> ChickenArrayList < 치킨 같은 것을 가지고 무의미 당신이 ChickenArrayList에서 일부 기능을 다시 사용하려는 경우,

class ChickenArrayList extends ArrayList<Chicken> 

같은 것을 만들거나 할 수 있습니다 있도록 인식 한 생각 이 추상 (제네릭)하고 그 위에 또 다른 콘크리트, 비 제네릭 클래스를 넣어야 :이 꽤 자세한 것을 알고

class AbsChickenArrayList<T extends Chicken> extends ArrayList<T> 
// and 
class ChickenArrayList extends AbsChickenArrayList<Chicken> 
class HenArrayList extends AbsChickenArrayList<Hen> 

, 그러나 이것은 당신이 ~ 십팔년과 함께 할 수있는 최선입니다 오래된 언어.

+0

+1과 _ ~ 18 세의 언어 _. :-) –

1

합리적인 것을 얻을 수 있다고 생각합니다. 당신은 당신이 이미 DwellingPropertySetter는 제네릭이 아닌 만든 의미

public class DwellingPropertySetter 
extends AbstractPropertySetter<Dwelling> 

이있는 경우, 모든 메소드 서명은 Dwelling을 사용합니다. 당신이

public class DwellingPropertySetter<T extends Dwelling> 
extends AbstractPropertySetter<T> 

을 말한다면 그 DwellingPropertySetter의 여러 가지가있을 수 있다는 것을 의미합니다 - 그리고 당신이 정말로 다른 사람을하고 싶은, 그래서 나는 이것이 당신이 정말로 계속하고 싶은 생각합니다. 또는 DwellingPropertySetter에 args가없고, Dwelling으로 가정되는 서브 클래스와 DwellingPropertySetter<T>의 서브 클래스가 다른 T으로 확장되는 불만이 있습니까? Java Generics에서는 그럴 수 없습니다.

+0

예. 나는 인자가없는'DwellingPropertySetter'와'Tw'를 가진'DwellingPropertySetter '을 확장하는 서브 클래스를 갖고 싶습니다. 기술적으로 가능하지 않은 이유는 무엇입니까? :-( –

+0

Java Generics에서는 다른 언어로 같은 개념을 구현할 때마다 유형 매개 변수를 사용하거나 사용하지 않습니다. 형식 매개 변수가 기본 값입니다. 편집 좀 봤는데, C++ 실제로 [지원 않습니다] (http://stackoverflow.com/questions/707780/is-there-a-reasonable-approach-to-default-type-parameters-in-c- 날카로운 제네릭) –

+0

@NewTalk 제네릭없이'SkyscrapperPropertySetter sps = new SkyscrapperPropertySetter()'를 쓰지 못하게하지 마십시오. – assylias