java如何约束泛型的类型

bluejoy345 2016-11-17 07:09:39
我有一个泛型接口暴露,现在有几个方法的入参同时使用到了这个接口,但是我希望某些方法约束此接口的实现泛型为String或者其他具体类型,请问怎么从语法上约束调用者必须将接口实现为String?

类似
interface A<T>{
public set(T t);
}

某个类的方法
public void m1(A a){};//希望语法上约束此方法的调用者,实现A<String>
public void m2(A a){};/希望语法上约束此方法的调用者,实现A<Integer>
public void m3(A a){};/希望语法上约束此方法的调用者,实现A<Long>

如果
public void m3(A<String> a){};
这样,即使调用者泛型为其他类型,编译也会通过,我希望阻止编译通过。
...全文
349 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Inhibitory 2016-11-18
  • 打赏
  • 举报
回复
同一个范型类的不同类型赋值在编译阶段好像还真判断不了类型,因为 Java 范型是假的,编译阶段都被擦除为 Object,只有在运行阶段进行类型转换时发现类型转换失败
public class Test {
    public static void main(String[] args) {
        Test t = new Test();

        A a1 = new A<String>() {
            @Override
            public void set(String s) {
                System.out.println("A<String>: " + s);
            }
        };

        A a2 = (A<Integer>) n -> {
            System.out.println("A<Integer>: " + n);
        };

        t.m1(a1);
        t.m2(a2);
        t.m2(a1);
    }

    public void m1(A<String> a) {
        a.set("ABC");
    }

    public void m2(A<Integer> a) {
        a.set(12345);
    }
}

interface A<T>{
    void set(T t);
}
输出
A<String>: ABC
A<Integer>: 12345
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
	at Test$1.set(Test.java:5)
	at Test.m2(Test.java:26)
	at Test.main(Test.java:18)
岑如花 2016-11-17
  • 打赏
  • 举报
回复
楼主可以参考这篇博客http://m.blog.csdn.net/article/details?id=18084607
岑如花 2016-11-17
  • 打赏
  • 举报
回复
可以在泛型的类型参数中使用extents来限制:
<a extends ***>的形式来限定

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧