Java中能否在非泛型类中创建仅接收String或Int的泛型方法?
可以实现,给你两种实用方案:
方案1:直接用方法重载(最符合Java习惯)
既然只接受String和int类型,没必要用泛型,直接写两个重载方法就行,编译时就会限制参数类型:
public class NonGenericClass { // 处理String参数 public long anyMethod(String value) { // 这里写String对应的逻辑,比如返回字符串长度 return value.length(); } // 处理int基本类型参数 public long anyMethod(int value) { // 这里写int对应的逻辑,比如返回数值的2倍 return (long) value * 2; } }
调用时只能传String或int,其他类型直接编译报错,完全满足你的需求。
方案2:泛型方法+重载限制(一定要用泛型的情况)
如果非要用泛型方法的形式,可以通过重载配合泛型,让编译器只允许String和Integer(int会自动装箱成Integer):
public class NonGenericClass { // 核心泛型方法,内部做类型判断 private <T> long anyMethod(T value) { if (value instanceof String) { return ((String) value).length(); } else if (value instanceof Integer) { return (long) ((Integer) value) * 2; } // 运行时兜底,不过编译时已经限制了参数类型,一般不会走到这 throw new IllegalArgumentException("只接受String或Integer类型"); } // 对外暴露的String重载方法,引导编译器匹配 public long anyMethod(String value) { return anyMethod((Object) value); } // 对外暴露的Integer重载方法,int会自动装箱进来 public long anyMethod(Integer value) { return anyMethod((Object) value); } }
这样外部调用时,只有String和Integer/int能通过编译,其他类型会提示找不到合适的方法。
为什么你原来的代码不行?
你写的<T> long anyMethod(T value)没有给T加任何约束,T可以是任意类型,所以自然会接受所有参数。Java泛型不支持“联合类型”(比如<T extends String | Integer>这种语法不存在),没法直接通过泛型声明限制参数范围。
内容的提问来源于stack exchange,提问作者Ashar Khan
相关产品推荐
相关产品推荐

