我主要使用Java和泛型相对较新.我一直在阅读Java做出错误决定或者.NET有更好的实现等.
那么,泛型中C++,C#,Java之间的主要区别是什么?每个人的利弊?
<? super E>
和之间有什么区别<? extends E>
?
例如,当你看一下类时java.util.concurrent.LinkedBlockingQueue
,构造函数有以下签名:
public LinkedBlockingQueue(Collection<? extends E> c)
Run Code Online (Sandbox Code Playgroud)
并为方法之一:
public int drainTo(Collection<? super E> c)
Run Code Online (Sandbox Code Playgroud) 在集合方面,我理解泛型.但是在Class<T>
课堂上它意味着什么呢?实例化Class
对象时,只有一个对象.那为什么T
参数呢?这是什么规定的?为什么有必要(如果是)?
我有这个Java代码.
public <T> T readObjectData(ByteBuffer buffer, Class<T> type) {
...
T retVal = (T) summaries;
return retVal;
Run Code Online (Sandbox Code Playgroud)
如何解释这段代码?为什么我们需要public <T> T
而不是public T
?
如何将参数赋给第二个参数(Class<T> type
)?
我找到了一个'不寻常'的通用语法,例如:
Arrays.<String>asList(...);
Collections.<String>emptyList();
Run Code Online (Sandbox Code Playgroud)
显然,这些方法的结果是通用的.这种语法是否用于类型检查?一个Object
阵列不能为一个参数Arrays.<String>asList(...)
.
我尝试用SWIG生成java代码
在MyList.h中,我声明了一个名为_list的自定义列表对象
List<T*> _list;
Run Code Online (Sandbox Code Playgroud)
这个List类继承自vector
class List : public vector<T>
Run Code Online (Sandbox Code Playgroud)
在业务类中(在C++中),我返回一个自定义对象列表
List<MyObject> getMyList(){
....
return list;
}
Run Code Online (Sandbox Code Playgroud)
所以我想生成java代码,我可以在这里检索这个C++ List作为java.util.List或java.util.Vector.
在我的swig.i文件中,我无法管理如何体现
%typemap(jstype) List "java.util.Vector"
namespace std {
%template(CustomVector) vector<MyObject>;
}
Run Code Online (Sandbox Code Playgroud)
任何种类的帮助如何配置此swig.i模板文件或一些示例代码生成java.util.List/Vector返回函数将不胜感激.
谢谢.
前言: 我理解泛型以及它们是如何在类级别声明的(例如class MyClass<T>
),但我从未在静态方法的层次上声明它,并且没有任何明确的绑定(例如class MySubclass<String> extends MyClass
).
我在我正在处理的应用程序中找到了这段代码片段(我没有写这部分).我从未见过以这种方式声明的方法.<T>
是不是在类中定义的其他地方.Intent.getExtras().get()
返回Object
实际上可能是一个String
,Boolean
...等等.
private static <T> T getItemExtra(final Intent intent, final String extraName) {
T item = null;
if(intent != null && intent.getExtras() != null) {
item = (T) intent.getExtras().get(extraName);
}
return item;
}
Run Code Online (Sandbox Code Playgroud)
样品用法:
String s1 = getItemExtra(someIntent, "some_string_extra");
Uri u1 = getItemExtra(someIntent, "some_uri_extra");
Run Code Online (Sandbox Code Playgroud)
JVM如何知道要使用的类型<T>
?(是的,此方法编译并成功执行).