2012-03-09 13 views
6

EDIT: Zostawię to tutaj jako przykład. Przeczytaj komentarze, aby uzyskać więcej informacji, ale ogólnie: NIE UŻYWAJ TEGO PROJEKTU! To jest złe!Java - przesłonięcie obiektu Typ parametru z betonu typu

Szukałem odpowiedzi na chwilę teraz, ale nie mógł znaleźć coś naprawdę konkretnego powiedzenie, nie można nie bo ... czy tak można to w jaki sposób to zrobić ..

Tak pytanie brzmi: Czy mogę stworzyć abstrakcyjną metodę definiowania parametrów typu Object, a następnie coś wdrożyć go z betonowej typ parametrów takich jak to:

public abstract class ToBeOverriden { 
    public Object method1 (Object parameter); 
    public String method2 (Object parameter); 
    public void method3 (Object parameter); 
} 

a potem go nadpisać to:

public class Implementation { 
    @Override 
    public DateTime method1 (Person parameter){ 
     return new DateTime(); 
    } 

    @Override 
    public String method2 (MotorCycle parameter){ 
     return new DateTime(); 
    } 

    @Override 
    public void method3 (String parameter){ 
     return new DateTime(); 
    } 
} 

Gdzie Osoba jest obiektem stworzonym przeze mnie. Typ zwrotu może być dowolny. Obecnie nie mogę tego zrobić. To mi nie pozwala. Domyślam się, że to dlatego, że moja klasa nie rozszerza Object. Chociaż wszystko rozszerza Obiekt ... Więc ...

Czy muszę odświeżyć swoją wiedzę o Javie? :)

EDYCJA: Dodano bardziej złożoną strukturę klas.

Dzięki!

Odpowiedz

15

będzie musiał użyć Java Generics:

public abstract class ToBeOverriden<E,V> { 
    public E method (V parameter); 
} 

public class Implementation extends ToBeOverriden<DateTime,Person> { 
    @Override 
    public DateTime method (Person parameter){ 
     return new DateTime(); 
    } 
} 

Dodano:

E parametr może być, pominięte, kod będzie nadal skompilować. Jeśli jednak różne implementacje ToBeOverriden będą używały różnych typów zwracanych, myślę, że lepiej jest zachować E. Ale to kwestia osobistego gustu - nie lubię, gdy widzę Object w dowolnym miejscu kodu.

Dodany 2:

Jak o swoim aktualizacji na pytanie, trzeba by mieć oddzielny typ rodzajowy dla każdej metody. Na przykład:

public abstract class ToBeOverriden<A,B,C> { 
    public Object method1 (A parameter); 
    public String method2 (B parameter); 
    public void method3 (C parameter); 
} 

Jednak zazwyczaj, gdy potrzebujesz tak okropnej struktury - twój kod jest źle zaprojektowany. W 95% przypadków wystarczy jeden rodzajowy parametr. W 4,99% przypadków wystarczą dwa ogólne parametry.

+1

* E * nie jest wymagany, wymagany jest tylko * V *. –

+0

@AmirPashazadeh Masz rację, nie pomyślałeś o tym. Zaktualizowałem moją odpowiedź. – bezmax

+0

Co się stanie, jeśli ma więcej niż jeden typ/typ zwrotu? Czym zatem będzie E? – Hannibal

0

to zrobić :) The spec mówi:

Dwie metody mają ten sam podpis, jeśli mają taką samą nazwę i argumentu typów.

Możesz łatwo mieć public Object method (Object parameter); i public Object method (Person parameter); w swojej klasie obok siebie, a będą to różne metody.

I tak, wszystkie klasy ostatecznie przedłużają Object.

2

można wykonać następujące czynności:

public abstract class ToBeOverriden<T> { 
    public Object method (T parameter); 
} 

public class Implementation extends ToBeOVerriden<Person>{ 
    @Override 
    public DateTime method (Person parameter){ 
     return new DateTime(); 
    } 
} 

Ale nie można tego zrobić bez generification, a problem jest argument, a nie typ zwracany. Przypuśćmy, że możesz to zrobić bez generowania, możesz wtedy odwołać się do obiektu implementacji za pomocą interfejsu i możesz wywołać metodę z dowolnym obiektem jako argumentem, a nie tylko osobą (która jest przeciwna bezpieczeństwu typu Java).

Powiązane problemy