2014-03-24 2 views
1

특정 유형의 개체에서 작동해야하는 일반 서비스를 작성하고 싶습니다. 해당 서비스의 사용자 정의 구현을 작성할 때 변수가 될 수 없으므로 반대하고 싶습니다. 따라서 나는 그 객체를 생성하는 메소드를 오버라이드하고 싶었다.제네릭 클래스 내에서 개체의 제네릭 형식을 반환하는 방법?

하지만 작동하지 않습니다. 다음과 같은 자바를 구현하는 것이 불가능합니까?

class MyService<T extends Foo> { 
    //Type mismatch: cannot convert from Foo to T 
    public T createObject() { 
     return new Foo(); 
    } 

    public void run() { 
     T t = createObject(); 
     //work with the object 
    } 
} 

class Bar extends Foo; 
class CustomService<Bar> { 
    @Override 
    public Bar createObject() { 
     return new Bar(); 
    } 
} 

답변

2
class NewArrayList extends ArrayList { 

} 

abstract class MyService<T> { 
    public abstract T createObject(); 

    public void run() { 
     T t = createObject(); 
     //work with the object 
    } 
} 

class CustomService extends MyService<NewArrayList> { 
    @Override 
    public NewArrayList createObject() { 
     return new NewArrayList(); 
    } 
} 
2

문제는 Foo을 반환하는 기본 구현을 제공하고 있다는 것입니다. 이 구현은 서브 클래스에 적절하지 않으므로 서브 클래스를 강제로 대체 할 수 없습니다.

MyService<T>abstract T createObject()이 있어야합니다. Foo의 경우 Foo 특정 서브 클래스 FooService<Foo>을 만드십시오.

1

정확함; 너는 그렇게 할 수 없다. T generic 매개 변수는 "Foo의 하위 클래스 인 일부 클래스"(클래스는 자체의 하위 클래스 임)를 나타냅니다. Foo을 확장하는 클래스 일 수 있으므로 Foo이라고 정확하게 가정 할 수 없습니다.

그것에 대해 생각 : 당신이 클래스 Bar extends Foo이 있고 경우에 당신이 한 :

MyService<Bar> service = ... 
Bar myBar = createObject(); 

다음 코드는 Foo을 만들고 ClassCastException의 결과 Bar —로 다운 캐스트하려고합니다. generics의 요점은 부정확 한 형변환과 그에 따른 예외를 피하는 것입니다.

관련 문제