繁体   English   中英

java非字符串类型的泛型类

[英]java generic classes of String non primitive type

我正在研究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的类型可以是字符串,整数或任何其他类型。 但是有可能我可以创建具有特定类型参数的泛型类。 类似于下面的示例,但显示错误“无法对非静态类型的String进行静态引用”

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作为参数创建类的通用类generictype 如果没有,那为什么呢?

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

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

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

您要描述的是一个非泛型类。 删除类型参数。

public class Genericstring {
  String name;

  // Etc
}

不,你不能。

这段代码: Genericstring<String>仅命名Generic Type Variable,而不是设置为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这不是完成您的方案的唯一方法,当您提到Cant时,您的权利就是我们提到的,就像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,可以禁用该部分代码的强大而灵活的语言功能。 有些类然而,不应该(在某些情况下不能 )设计充分继承考虑的一个好办法。 在这些情况下,将类标记为最终类是有意义的,即使它限制了OOP。 (但是请记住,最后一堂课仍然可以扩展另一个非最后一课。)

相关文章: Java:何时创建最终类


@linuxman您要完成的工作没有任何意义,因为通用类型的目的是声明可以实现不同类型行为的合同。

希望它能帮助您消除疑虑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM