java泛型类String非基本类型

时间:2018-01-07 13:08:40

标签: java generics

我正在学习java泛型类。使用T作为类型参数创建一个泛型类。

public class Genericstring<T> {
    String name;

    public void set(String name){
        this.name = name;
    }

    public static void main(String[] args){
        Genericstring<String> o = new Genericstring<String>();
        o.set("Generic");

        System.out.println(o.name);
    }
}

在上面的例子中,T的类型可以是字符串,整数或任何其他类型。但是,我可以创建具有特定类型参数的泛型类。如下例所示,但其显示错误&#34;无法对非静态类型字符串进行静态引用&#34;

public class Genericstring<String> {
    String name;

    public static void main(String[] args){     
        //Here creating object always having string type attributes. No need to specify like did in above example.
    }

任何人都可以告诉我,是否可以使用String创建泛型类作为参数类泛型?如果没有,那么为什么?

2 个答案:

答案 0 :(得分:2)

Genericstring<String>声明了一个名为String的类型变量。

这使得String的所有其他用途都引用该类型变量,而不是java.lang.String。如果您将main的参数声明为String[],则认为您的意思是类型变量。因为这是一个静态方法,所以你不能在那里引用那个类型参数,因为它属于类的实例。

  

但是,我可以创建具有特定类型参数的泛型类。

您所描述的是非泛型类。删除类型参数。

public class Genericstring {
  String name;

  // Etc
}

答案 1 :(得分:0)

不,你不能。

此代码:Genericstring<String>仅命名通用类型变量,而不是设置为java.lang.String。

您可以做的最多是声明扩展特定类的泛型类型:

public class Genericstring<T extends String>

示例:

abstract class B<T extends String> {
    protected T value;

    public T getValue() {
        return value;   
    }

    public void handleValue() {
        System.out.println(this.getValue().substring(0, 5));
    }
}

class C extends B<String>{
    public C() {
        this.value = "Hello World";
    }
}

public class A {
    public static void main(String[] args) {
        C obj = new C();
        obj.handleValue(); // prints Hello
    }
}

更新:根据评论,我的回答因为我实施的方式而产生了很多混乱。

@linuxman 这不是实现您的方案的唯一方法,而且当您提及我们只提及B or B<T extends String>时,您的权利是什么?

class B<T extends String> {
    protected T value;

    public T getValue() {
        return value;
    }

    public void handleValue() {
        System.out.println(this.getValue().substring(0, 5));
    }
}

public class A {
    public static void main(String[] args) {
        B obj = new B<String>();
        obj.handleValue();
    }
}

@Pshemo 是对的:

  

在这种情况下,只有可用的类型是String本身,但如果它只是一种类型,则没有必要使用泛型类型,因为它的主要部分是允许我们使用我们的类有很多类型。

另外,关于你对最终课程的疑问:

参考: https://stackoverflow.com/a/5181618/1715121

final课程只是无法扩展的课程。

(这并不意味着对类对象的所有引用都会像它们被声明为final一样。)

在这个问题的答案中涵盖了将一个类声明为final的有用之处:

  

如果Java是面向对象的,并且您声明了一个类final,那么它是否会阻止具有对象特征的类的想法?

在某种意义上是的。

通过将类标记为final,您可以为该部分代码禁用该语言的强大而灵活的功能。但是,某些类不应该(并且在某些情况下可以不是)设计为以良好的方式考虑子类。在这些情况下,将类标记为final是有意义的,即使它限制了OOP。 (但请记住,最终的课程仍然可以扩展另一个非最终课程。)

相关文章: Java: When to create a final class

@linuxman 您尝试完成的内容没有意义,因为通用类型的目的是声明可以实现不同类型行为的合同。

希望它有助于解决您的疑虑。