• 主页
  • Java SE
  • J2ME
  • Web开发
  • Java EE
  • Eclipse

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){};
这样,即使调用者泛型为其他类型,编译也会通过,我希望阻止编译通过。
...全文
165 点赞 收藏 3
写回复
3 条回复
公孙二狗 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 ***>的形式来限定
回复 点赞
发动态
发帖子
Java
创建于2007-09-28

1.8w+

社区成员

8.1w+

社区内容

Java相关技术讨论
社区公告
暂无公告