使用模板传递课程

时间:2018-03-07 01:46:07

标签: java generics

我创建了一个接口来抽象2个类的常用方法,这里是代码

const attr = dictionary.test.klass.attr; 
// but no id because declared type of `klass`
//  is `Klass` which does not have `id`

const attr = dictionary.test.t1.display;

我有另一个名为ProductResource的文件

package br.canabarro.resource;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Repository;

@Repository
public interface BaseResource<T, ID> {

    ResponseEntity save( T entity);

    ResponseEntity delete(ID id);

    ResponseEntity getAll();

    ResponseEntity getById(ID id);

    ResponseEntity update(ID id, T entity);
}

@Override @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity save(@RequestBody DtoProduct productDTO) { final Product product = new Product(productDTO.getName()); return ResponseEntity.status(HttpStatus.ACCEPTED).body(productService.save(product)); } 方法是在这个函数上实现的,但编译器返回方法不会覆盖其超类的方法,但如果我将函数参数更改为save将传递,类Product productParam对参数有Productid。 最后一部分是我的name,此方法还实现了一个名为ProductToDto

的接口
SuperConverter

如何更改package br.canabarro.dto.Conversor; import br.canabarro.dto.DtoProduct; import br.canabarro.entity.Category; import br.canabarro.entity.Product; import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; @Component public class ProductToDto implements SuperConverter<Product, DtoProduct> { @Override public DtoProduct apply(Product product) { List<String> categoriesID = product .getCategories() .stream() .map(Category::getId) .collect(Collectors.toList()); return DtoProduct .build() .id(product.getId()) .name(product.getName()) .builder(); } } 以使java了解我想要的是传递模板BaseResoucer而不是像T这样的类名。 对不起,如果问题变得那么长,但这对我来说是一个重要的问题。 在pastebin上我发布了DtoProductSuperConverter DtoProducthttps://pastebin.com/TmFRLQVz SuperConverterhttps://pastebin.com/VTSnMVhq

1 个答案:

答案 0 :(得分:0)

ProductResource定义为:

public class ProductResource implements BaseResource<Product, String>

所以Product在BaseResource中成为你的T.在这种情况下,期望ProductResource实现以下方法:

ResponseEntity save(Product entity);

它没有那样做。

您需要将ProductResource定义为:

public class ProductResource implements BaseResource<DtoProduct, String>

或者如果您想将其保留为Product,请执行以下方法:

ResponseEntity save(Product entity);

这不是Spring问题,而是Java泛型。看看https://docs.oracle.com/javase/tutorial/java/generics/index.html