我有一个关于Java的初学者问题。
我有一个类Thing<T>
,它有一个属性&#34;属性&#34;。
我希望该属性可以是LinkedList<T>
(由Java给出)或自定义类型My_Type<T>
,具体取决于赋予Thing
构造函数的布尔值。像这样:
public class Thing<T> {
private ??? attribute; // Type is not given yet. How do I do this?
public Thing(boolean which) {
if (which)
attribute = new LinkedList<T>();
else
attribute = new My_Type<T>();
}
...
}
Thing
还有一些使用add
和remove
的方法,这些方法都是针对LinkedList
和My_Type
实现的。
如何申报我的属性?将其声明为Object不是选项,因为Object不知道方法add
和remove
。我想过使用接口,但我不知道如何。
如果LinkedList
和My_Type
都由我编写,我可以让他们都实现具有LinkedListOrMy_Type<T>
和add
方法的接口remove
。然后,而不是
private ??? attribute;
我会写
private LinkedListOrMy_Type<T> attribute;
一切都会好的。但是因为我无法修改LinkedList
的代码,所以我不知道如何解决这个问题。有什么建议吗?
使My_Type
实现List
接口(由Java给出)也不是一种选择,因为我需要在My_Type
中实现许多方法。但我只想要add
和remove
。我知道这是一种可能的解决方法 - 我可以让My_Type
在列表的每个方法中抛出UnsupportedOperationException
,add
和remove
除外。但是我相信如果你给我一个不那么肮脏的建议,我可以学到更多关于优秀编程的知识!
答案 0 :(得分:1)
走界面路线似乎是个好主意。定义您自己的界面MyInterface
并让MyType
实现它:
class MyType implements MyInterface
现在就是诀窍: LinkedList
不是最终的!通过扩展JDK类并让它实现你的界面来使用OOP:
class MyLinkedList extends LinkedList implements MyInterface
请告诉我们这是否适合你......
答案 1 :(得分:1)
在Java中,不能有一个可以是两种不同类型的字段;你可以做的最接近的是一个常见基类型的字段。所以你有几个选择。
使用提供add
和remove
的通用基本类型。显而易见的候选人是Collection
,由LinkedList
实施。
使用不提供所需方法的公共基本类型,但在需要时强制转换对象。在这种情况下,您可以只使用Object
类型的字段,并且每次要使用您的字段时,都必须将其强制转换为任何实际类型。
使用两个字段。这似乎更有意义 - 拥有两个不同类型的变量并不是变量的工作方式。
将LinkedList
和MyType
包含在具有提供所需方法的公共基本类型的类中。
例如:
interface WrapperThing<T> {
void add(T item);
void remove(T item);
}
class ListWrapperThing<T> implements WrapperThing<T> {
private List<T> list;
public ListWrapperThing() {
list = new LinkedList<T>();
}
public void add(T item) {
list.add(item);
}
public void remove(T item) {
list.remove(item);
}
}
class MyTypeWrapperThing<T> implements WrapperThing<T> {
private MyType<T> my;
public ListWrapperThing() {
my = new MyType<T>();
}
public void add(T item) {
my.add(item);
}
public void remove(T item) {
my.remove(item);
}
}
然后您可以使用WrapperThing<T>
变量,就好像它是一个可以(在其中)包含List
或MyType
对象的变量。
答案 2 :(得分:0)
好吧,您可以在类型中实现接口List
。它由Java中的所有列表实现。当然它提供了比你可能需要的更多的方法,但你可以只实现你需要的方法,例如在其他方法中抛出未实现的异常。