不懂就问, Java 泛型,泛型方法,泛型接口

2021-12-30 22:45:21 +08:00
 RiceMarch

这是原有的泛型接口和具体的某一个实现类

//泛型接口
public interface SaveService<T> {
    void save(List<T> saveList);
}

//具体实现类
public class UserSaveServiceImpl implements SaveService<User>{
    @Override
    public void save(List<User> saveList) {
        //...
    }
}

处于一些原因,必须把泛型接口改成非泛型接口...(很奇葩的问题,但是必须改掉接口的泛型)

public interface SaveService {
   <T> void save(List<T> saveList);
}

于是想把泛型方法续上...强行续...

public class UserSaveServiceImpl implements SaveService{

    @Override
    public <T> void save(List<T> saveList) {
        
    }
    
    //期望还能续上指定的类型 User
}

结果也很明显,具体实现类上的类型算是完蛋啦,请问如何能满足这样的奇葩需要么(能满足么...

3463 次点击
所在节点    Java
25 条回复
Joker123456789
2021-12-31 13:00:23 +08:00
按照你现在的写法,你传进来什么类型,T 就是什么类型,但是无法 在创建对象的时候 约束 这个方法只能接收什么类型。

既然如此,不如 把 T 去掉咯,只要是 List 就收。

如果 你想 实现在创建对象的时候 约束 这个方法只能接收什么类型,那么 接口上的 <T> 是必须保留的,也就是必须用你一开始的那种方式。

如果你现在遇到的需求,用泛型是 最佳的方案,那你可以去跟 不让你用泛型的那个人 商量一下 怎么解决。
如果不用泛型问题也不大,那么干脆去掉泛型把,因为你现在的这个做法 体现不出泛型的意义。
aliveyang
2021-12-31 15:51:35 +08:00
看不懂问题
RiceMarch
2021-12-31 18:44:18 +08:00
@aguesuka 其实本质上是同事的奇葩想法 想把 interface SaveService<T>的这个 T 去掉我今天已经拒绝了他这个要求 hhhh
RiceMarch
2021-12-31 18:46:50 +08:00
@Joker123456789 确实是的 今天已经和她商量过了 List 的类型肯定还是要的 不然静态检查直接被拦截了 hhhhh 还是按照第一种继续做了
okou19900722
2022-01-07 11:34:58 +08:00
很简单,因为 java 里的泛型是擦除的。
目前我了解的可以通过反射获取到泛型的,似乎只有子类实现父类时,传给父类的泛型可以获取,比如

List<String> list = new ArrayList<String>();
这样写,拿不到,因为泛型是 ArrayList 上的,但

List<String> list = new ArrayList<String>(){};
这样写就可以拿到泛型,这是因为这实际上是生成了一个 ArrayList 子类的匿名类的对象。

具体的原因,我说不清楚,写过 gson 的,应该对 TypeToken 很熟悉,基本都是 new TypeToken<xxxx>(){}的写法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/825385

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX