继承中的Java泛型
我对java的泛型有一些(哲学上的?)问题 考虑以下几点继承中的Java泛型,java,generics,Java,Generics,我对java的泛型有一些(哲学上的?)问题 考虑以下几点 public interface ClassA<I> {} public class Obj implements ClassA<String> {} public interface ClassB<I, T extends ClassA<I>> { public I getSomething(); public T getAnotherThing(); } 公
public interface ClassA<I> {}
public class Obj implements ClassA<String> {}
public interface ClassB<I, T extends ClassA<I>> {
public I getSomething();
public T getAnotherThing();
}
公共接口ClassA{}
公共类Obj实现类a{}
公共接口类别B{
我得到了一些东西;
公众不能得到其他东西();
}
如果类B的对象被实例化为:
ClassB<String, Obj<String>> o = new ClassB<>();
o.getSomething(); // <-- Returns String
ClassB o=newclassb();
o、 getSomething();// 我认为答案是“不”。)
Java不提供从类型本身提取类型参数的方法,只提供从具有该类型的参数提取类型参数的方法
例如:
但是,正如你所指出的,这也不被接受。Java的语法需要扩展才能实现这一点。这个例子太琐碎了。如果在<代码> ClassB < /代码>中从未使用或返回类型<代码> t>代码>,那么不要把它放在类声明中。请考虑在该类T(在本例中,Obj)中明确使用方法的方法。我不想让这个例子变得复杂,因为它会把注意力从实际问题上移开。不,你不能这么做。如果要将该方法声明为返回类型,则必须为该类型指定名称,只需添加一个public T getAnotherThing()
然后您就有了明确使用泛型T
的代码。真的这么多吗?:)@dhke我想你误读了这个问题-它是T扩展ClassA
其中ClassA
!=<代码>类
。
public interface ClassB<T extends ClassA<I>> { // <-- Won't compile
public I getSomething();
}
ClassB<Obj> o = new ClassB<>();
o.getSomething(); // <-- Returns String from Obj declaration, which uses ClassA<String>
class ClassB<T extends ClassA<?>> {
<I> I getSomething(ClassA<I>) { ... }
}
public interface ClassB<T extends ClassA<I>>