有没有办法为通用模板指定默认类型?
假设我有一个Monkey
课程。猴子可以生活在不同的Environment
中,例如Jungle
或Zoo
:
public class Monkey<T extends Environment> { T home; ... public T getHome() { return home; } }
有没有办法为T
指定默认值,因此我可以使用Monkey
类型而不是Monkey<?>
而不会收到编译器警告?
修改
换句话说,有没有办法摆脱“原始类型”警告而不必明确地压制它?
答案 0 :(得分:25)
不,你不能这样做。通用参数没有默认值。您可以重新组织类型层次结构,以便有一个GenericMonkey和一个Defaultconkey,它将泛型参数设置为您想要的默认值。
答案 1 :(得分:5)
不,你不能: 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中使用),我发现它很漂亮。
答案 2 :(得分:1)
为什么不直接使用Generic的基类? Monkey<Environment>
?
答案 3 :(得分:1)
Jen,你的问题没有说明为什么要使用泛型。如果您说明了您正在尝试做什么以及为什么使用泛型,那将非常有用。泛型存在IMHO 主要是,以避免在将事物放入并将其从设计为类型的通用持有者的集合中带到各处时进行类别转换。这个有点意味着迭代一堆东西,但不一定。
我的观点是,我没有看到您的类或代码的任何部分需要能够创建需要迭代环境的猴子类的自定义版本。如果不是这种情况,您可能甚至不需要泛型。相反,您可能想要依赖注入。猴子类应该有一个带有环境的构造函数。 Environment是一个接口(或简单的基类)。该接口有几个默认操作,如getBathroomLocation()和getFoodLocation()。您不是使用泛型来创建一种生活在动物园中的猴子,而是创建一只猴子并注入它所依赖的环境的依赖性。
Monkey monkey = new Monkey(new CostaRicaJungle());
稍后,您可以将此环境设置为不同的环境。野生猴子被捕获了,现在你做了
monkey.setEnvironment(new BronxZoo());
后来,猴子得到了生活条件升级,你做了
monkey.setEnvironment(new SanDiegoZoo());