Implementacja metody generycznej

0

Mam interfejs:

public interface Dao {

	...
	public <T> List<T> getList(List<String> idList);
    public <T> List<T> getAll();	
...
}

Oraz implementacje:

	@Override
	public  List<Product> getList(List<String> idList) {
		return null;
	}

	@Override
	public List<Product> getAll() {
		return null;
		
	}

dlaczego przy impelentacji pierwszej metody występuje błąd:

Multiple markers at this line
	- The method getList(List<String>) of type ProductDao must override 
	 or implement a supertype method
	- implements server.interfaces.Dao.getList
	- Name clash: The method getList(List<String>) of type ProductDao 
	 has the same erasure as getList(List<String>) of type Dao but does not override 
	 it

a drugą mogę w taki sposób zaimplementować?
podczas gdy dopiszę do metody <Product> przed zwracanym typem

	public <Product> List<Product> getList(List<String> idList) {
		return new Product
				.ProductBuilder("")
				.setName("")
				.setPrice("")
				.setMadeIn("")
				.setPhotoFolderPath("")
				.build();

	}

mogę zwrócić nulla ale nie mogę zwrocić nowego obiektu bo wyskakuje błąd

llegal qualified access from the type parameter Product

Trochę dziwne zachowanie, jo co właściwie chodzi?

0

ehh trochę pomyliłem, mam taką implementację metody:

		MapSqlParameterSource params= new MapSqlParameterSource();
		params.addValue("id", listId);
		return jdbc.query( "Select * FROM Product WHERE id in (:id)", params, new RowMapper<Product>() {
			@Override
			public Product mapRow(ResultSet resultSet, int rowNumber) throws SQLException {
				Product product= new Product
						.ProductBuilder(String.valueOf(resultSet.getInt("idEPC")))
						.setName(resultSet.getString("name"))
						.setPrice("price")
						.setMadeIn("madeIn")
						.setPhotoFolderPath("photoFolderPath")
						.build();

				return product;
			}
		});

Która zwraca mi listę produktów. Działa bez implementacji interfejsu.

0

Czekaj czekaj, to co ci w końcu nie działa... bo z tymi generykami to trochę odpaliłeś, ty chcesz mieć type-parameter, np:

interface Dao<T> {
    public List<T> getList(List<String> idList);
    public List<T> getAll();
}

class asdasd implements Dao<String>{
    @Override
    public List<String> getList(List<String> idList) {
        return null;
    }

    @Override
    public List<String> getAll() {
        return null;
    }
}

//Edit, to co zrobiłeś wcześniej nie ma sensu, bo to była generyczna metoda, możesz ją wykorzystać w ten sposób

class Main{
    static <T> List<T> emptyList(){
        List<T> test = new ArrayList<>();
        return test;
    }

    public static void main(String... args){
        Main.<String>emptyList();
    }
}

//
@Koziołek wywołałeś temat z lasu tymi generykami D:D:D:D:D:D albo to któryś z Twoich podopiecznych :D

0

chcę zrobić interfejs w którym metody mają przyjmować określone parametry np. listy stringów, a zwracać np listę dowolnych obiektów.

0
public <Product> List<Product> getList(List<String> idList)

Ten zapis nie różni się niczym od:

public <T> List<T> getList(List<String> idList)

ani nawet od:

public <TreleMorele> List<TreleMorele> getList(List<String> idList)

Stworzyłeś sobie po prostu type parameter z taką samą nazwą jak klasa i w ten sposób przysłoniłeś nazwę tej klasy.

Natomiast jeśli dodasz opcję "-Xlint:unchecked" do kompilatora Javy to dostaniesz taki komunikat:

Warning:(39, 26) java: getAll() in Impl implements <T>getAll() in Dao
return type requires unchecked conversion from java.util.List<Product> to java.util.List<T>

Jesteś w stanie zaimplementować metodę w ten sposób tylko dzięki type erasure i związanymi z tym niedociągnięciami. Ostrzeżeń tego typu nie należy jednak ignorować, bo świadczą o źle napisanym kodzie, który raczej nie będzie robił tego co autor miał na myśli.

0

środek tej metody z jdbc.query jest popierd... bo trochę to poprzemieniałem testując więc można to olać. Chodzi o to co napisałem w poprzednim poście. Chyba nie ogarniam do końca interfejsów :)

0

Ale Ty mówisz(piszesz) o tym przypadku w którym on zwraca raw liste return product; ???? bo w tym pierwszym poście nie będzie żadnych łorningów - niezdecydowany 3 minuty temu

Kod z pierwszego posta w ogóle się nie skompiluje:
http://ideone.com/xhYmzx

duo, te metody będą się różnić, przecież ... w jednym przypadku masz type parameter, dalej, po type erasure będziesz miał raz, List<Object> a w drugim przypadku List<TreleMorele> albo List<Product>

Nie będą się różnić. Zarówno Product, T jak i TreleMorele to tutaj nazwy dla typu generycznego, przysłaniające nazwy klas o takich samych nazwach (o ile takie istnieją).

Po type erasure to chyba zawsze dostanę gołą List bez żadnego typu.

0

Tak jak napisałem. Chcę stworzyć interfejs, który będzie zawierał między innymi deklaracje metod, które mają zwracać listę obiektów o dowolnym typie a przyjmować jako argumenty listę Stringów. Po Twojej pierwszej odpowiedzi poprawiłem swój kod i nie mam już żadnych problemów. Wielkie dzięki! :)

0

To jaki masz kod? Taki kod się kompiluje z warningiem który już podałem:

import java.util.Collections;
import java.util.List;

class Product {
}

interface Dao {
    public <T> List<T> getAll();
}

class Impl implements Dao {
    @Override
    public List<Product> getAll() {
        return Collections.singletonList(new Product());
    }
}

public class MainJ {

    public static void main(String[] args) {
        Dao dao = new Impl();
        List<Integer> list = dao.getAll();
        Integer head = list.get(0);
        System.out.println(head);
    }
}

Oczywiście ten kod nie działa poprawnie, wywala się przy rzutowaniu do Integera, bo Product na Integera nie da się zrzutować.

0

bez tworzenia Interfejsu wszystko śmigało. Przekształcałem kod i napotkałem problemy. Niezdecydowany podsunął mi pod nos rozwiązanie i dostosowałem je do mojego przypadku. Dostawałem dwa errory i nie mogłem ich sam rozwiązać bo nie wiedziałem o co chodzi. Dzięki jeszcze raz za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1