2015-09-22 101 views
1

我有我想概括两类:T是什么类型?

public class General<T> { 
    T content; 
    setContent(T content) { ... };  
} 
public class Specific { 
    Foo text; 
    setText(Foo text) { ... }; 
} 

T可以有三种不同的类型,所有这些类。 Foo是其中之一,Pair是另一个。 我要介绍一个抽象超推广到的属性的访问:

public abstract class Superclass { 
    abstract void setText(Foo text); 
} 

这两个类(GeneralSpecific)延伸此超类。但现在我已经实现了类General的制定者一个问题:

public void setText(Foo text) { 
    if (T is of type Foo) content = (T) text; 
    if (T is of type Pair) ((Pair)content).setHead(text); 
    ... 
} 

我有什么写的,而不是is of type? Java中有没有这样的表达式在编译时被评估?

我可以检查什么类型的content是,但我想这不会工作,如果是null。另外,我可以用? extends Object之类的东西代替T,但是如何创建(之前)T的实例呢?

我用Google搜索了一下,但是我找不到这个特定问题的充分答案。

+6

有没有表达式会在编译时进行评估,因为泛型代码将被共享。相反,你可以像'class GeneralInteger extends General '这样做,并在其中覆盖'setText'。 –

+1

你几乎不能做你想做的事情,而且必须找到另一种方法。其他一些评论已经提出了一些方法来实现它。 –

回答

0

您可以创建这些类2种不同的方法:

public abstract class Superclass { 
    abstract void setText(Foo text); 
    abstract void setText(Pair text); 
} 
+0

当我使用这些类时,我通常不知道我是否有一般或特定的对象。如果我只介绍其中的一种方法,那么我需要在每个地方使用'instanceof'的ifs。没有选择。 – sinned

0

而不必一个抽象类使用的接口的概念(与父参考)然后ü可以动态决定的....

+0

所以我有一个由Foo,Pair和我可能在其中使用的其他类型实现的接口。当然这是'正确'的解决方案,但在我的情况下,我更喜欢解决方案较少侵入。 – sinned

相关问题