泛型限定问题

2021-10-28 14:54:51 +08:00
 77yf77yf77yf
Class<? extends A & B>这样写为何不行,有什么替代方法
1682 次点击
所在节点    Java
11 条回复
wolfie
2021-10-28 15:25:20 +08:00
Java 不支持多继承
B 可以为 Interface
77yf77yf77yf
2021-10-28 15:33:59 +08:00
@wolfie 没说清楚不好意思,A 是一个抽象类,B 是一个接口,这样写上去 idea 会报错
hingbong
2021-10-28 15:53:32 +08:00
<T extends Object & Serializable> void a(Class<T> t) {}
hingbong
2021-10-28 15:53:45 +08:00
@hingbong 我这么写没报错
wolfie
2021-10-28 16:01:17 +08:00
@77yf77yf77yf #2
检查 idea 配置 module sdk 、java compiler 版本。
检查 抽象类 和 Interface 方法冲突
77yf77yf77yf
2021-10-28 16:05:26 +08:00
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface CacheKey {
Class<? extends AbstractStdCacheNaming & ICacheKeyNamingStrategy> keyGen() default EntityBasedKeyNamingStrategy.class;
...
}

public abstract class AbstractStdCacheNaming {...}

public interface ICacheKeyNamingStrategy {...}


Class<? extends AbstractStdCacheNaming & ICacheKeyNamingStrategy> keyGen() default EntityBasedKeyNamingStrategy.class;
这一句就报错了

@hingbong
hingbong
2021-10-28 16:32:46 +08:00
注解上不行
@interface members may not have type parameters
非注解可以
public interface CacheKey {
<T extends Object & Comparable<? super T>> Class<T> keyGen();
}
hingbong
2021-10-28 16:33:20 +08:00
77yf77yf77yf
2021-10-28 16:43:22 +08:00
@hingbong 那对于注解有什么替代方案吗,不然只能用反射检查?
hingbong
2021-10-28 17:03:57 +08:00
我是写 kotlin 的
试了一下 kotlin 可以,但是那个注解到 Java 下又无法使用,只能在 kotlin 里用,Java 里我就不清楚了
77yf77yf77yf
2021-10-28 17:36:45 +08:00
@hingbong 好的,谢谢了

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

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

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

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

© 2021 V2EX