Java泛型类能否指定String为类型参数?报错原因解析
能不能创建以String作为参数类型的泛型类?
首先直接给结论:你其实不需要用泛型就能实现需求——如果你的类属性固定是String类型,写一个普通类就够了。泛型的核心价值是让类/方法支持多种类型的复用,固定单一类型完全没必要用泛型。
为什么你的代码会报错?
你写的这段代码:
public class Genericstring<String> { String name; public static void main(String[] args){ //希望创建的对象始终拥有String类型属性,无需像之前那样指定类型 } }
问题出在<String>上——这里的String不是Java自带的java.lang.String,而是你自定义的泛型类型参数占位符。也就是说,你把泛型的类型参数命名成了String,这就导致:
- 类里的
String name中的String指代的是这个自定义的类型参数,不是真正的字符串类型 - main方法是静态方法,而泛型的类型参数是属于类实例的(非静态),静态方法无法直接引用非静态的类型参数,所以编译器才会抛出
Cannot make a static reference to the non-static type String的错误
正确的实现方式
如果你的需求是让类的属性始终是String类型,直接去掉泛型声明,写普通类就好:
public class Genericstring { String name; public void set(String name) { this.name = name; } public static void main(String[] args) { Genericstring o = new Genericstring(); o.set("Generic"); System.out.println(o.name); } }
这样创建对象时不需要指定类型,属性自然就是String类型,完全符合你的需求。
额外补充:如果非要用泛型限制为String?
虽然这完全没必要(失去了泛型的复用价值),但如果有特殊场景想让泛型类只能接受String类型,可以用泛型边界:
// String是final类,所以T只能是String类型 public class Genericstring<T extends String> { T name; public void set(T name) { this.name = name; } public static void main(String[] args) { Genericstring<String> o = new Genericstring<>(); o.set("Generic"); System.out.println(o.name); } }
但这个写法其实多此一举,直接用普通类更简洁高效。
总结一下:泛型是用来做类型通用化的,如果你要固定某一种类型,就别用泛型,直接用具体类型定义类即可。你的错误本质是把泛型参数命名成了Java的内置类名,导致了命名冲突和编译错误。
内容的提问来源于stack exchange,提问作者linuxman
相关产品推荐
相关产品推荐

