【问题标题】:Java: How to set a default for "T" in SomeClass<T>?Java:如何在 SomeClass<T> 中为“T”设置默认值?
【发布时间】:2011-08-31 09:20:05
【问题描述】:

有没有办法为通用模板指定默认类型?

假设我有一个Monkey 课程。猴子可以住在不同的Environments,比如Jungle或者Zoo

公共类 Monkey { 家; ... 公共T getHome() { 回家; } }

有没有办法为T 指定默认值,所以我可以使用Monkey 类型而不是Monkey&lt;?&gt; 而不会收到编译器警告?

编辑

换句话说,有没有办法摆脱“原始类型”警告而不必显式抑制它?

【问题讨论】:

标签: java generics


【解决方案1】:

不,你不能那样做。通用参数没有默认值。您可以重新组织您的类型层次结构,以便有一个 GenericMonkey 和一个 DefaultMonkey 将通用参数设置为您想要的默认值。

【讨论】:

    【解决方案2】:

    不,你不能: http://en.wikipedia.org/wiki/Comparison_of_Java_and_C%2B%2B

    泛型类型参数不能有默认参数。

    制作这样的东西怎么样:

    public class Monkey extends Monkey<YourType>
    

    显然你会“浪费”继承的能力。

    编辑 1: 另一个有趣的事情是按照我的建议做相反的事情,

    public class Monkey<T> extends Monkey
    

    在这种情况下,所有泛型类 Monkey 都继承了 Monkey,在某些情况下,这是一件非常有趣的事情(特别是当您注意到某些实例方法适用于所有类而不需要泛型时)。这种方法用在 Castle ActiveRecord 中(我见过它用在 C# 中,而不是用在 Java 中),我觉得它很漂亮。

    【讨论】:

    • 这两者是否必须在不同的文件中(我假设是因为在 java 中每个文件只能有一个公共类)?在这种情况下,你选择什么名字(因为一个是 Monkey 和另一个 MOnkey。
    • 嗯,这不是我真正考虑的问题,但是您可以将包含 Monkey(无通用参数)的文件命名为仅“Monkey”。以及您喜欢的通用猴子 MonkeyGeneric 或 Monkey_T_
    • java文件名不应该和公共类的名字一样吗?如果已经有一个名为 Monkey.java 的类,我基本上很好奇你会为 Monkey 取什么名字。
    • 我真的不知道这个,我认为这是一个约定。正如我在问题中所说,我已经看到在 C# 中使用它而不是在 Java 中。对不起,我帮不了你:(
    【解决方案3】:

    Jen,您的问题没有说明您为什么要使用泛型。如果您说明您正在尝试做什么以及为什么要使用泛型,那将非常有帮助。恕我直言,泛型的存在主要是为了避免在将事物放入和从设计为泛型持有者的集合中取出时必须在任何地方进行类转换。这有点意味着迭代一堆东西,但不一定。

    我的意思是,我没有看到您的类或代码的任何部分需要能够创建需要迭代环境的猴子类的自定义版本。如果不是这种情况,您可能甚至不需要泛型。相反,您可能想要依赖注入。猴子类应该有一个带有环境的构造函数。环境是一个接口(或简单的基类)。该接口有几个默认操作,如 getBathroomLocation() 和 getFoodLocation()。您无需使用泛型来创建一种生活在动物园中的猴子,而是创建一只猴子并注入它所在环境的依赖项。

    Monkey monkey = new Monkey(new CostaRicaJungle());
    

    稍后,您可以将此环境设置为不同的环境。野猴被抓了,你现在抓到了

    monkey.setEnvironment(new BronxZoo());
    

    后来,猴子得到了生活条件升级,你做了一个

    monkey.setEnvironment(new SanDiegoZoo());
    

    【讨论】:

      【解决方案4】:

      为什么不直接使用 Generic 的基类呢? Monkey&lt;Environment&gt; ?

      【讨论】:

      • 环境可能是抽象的,我们不知道。
      • 它可以,这就是我问的原因。但是,泛型类型不应该是抽象甚至接口吗?
      • Environment 将永远是具体的。
      猜你喜欢
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多