Tag: 泛型

Kotlin编译器的类型推断不能选择调用哪个方法(带有泛型类型的歧义)

所以,我有一些这些签名的Java方法(为简单起见,删除了注释和代码体): public class JavaClass { public static <E extends CharSequence> E join(E… array) { … } public static <E extends CharSequence> E join(CharSequence separator, E… array) { … } } 我在Kotlin中有一些代码,它调用了'join'方法: class KtClass { fun test(vararg array: String) { JavaClass.join(*array) } } 到现在为止还挺好; 它会传播可变参数并称之为方法签名。 好的! 例如,如果我想用“分隔符”参数来调用后一个方法签名,就会出现问题: class KtClass { fun test(vararg array: String) { JavaClass.join("<br>", […]

如何用Kotlin interop强制执行泛型

我在Kotlin中有一个方法,它返回一个通用列表的Rx Observable: public fun getObservable(): Observable<List<FooBar>> { return Observable.just(theList) } 因为Kotlin列表特征被定义为List<out T> ,所以Java会将返回类型看作Observable<List<? extends FooBar>> Observable<List<? extends FooBar>> 。 有没有办法告诉Kotlin编译器,Java应该将这个视为Observable<List<FooBar>> ? http://kotlinlang.org/docs/reference/generics.html 已更新为正确显示问题。

静态类型的语言与特性和函数重载?

是否存在任何语言: 是静态(强烈)键入 支持泛型(模板) 支持特性/多重继承/接口委派 允许函数重载(也是继承的成员) 基本上,在伪代码中,我想这样做: class Template<SomeType> { void function(SomeType i) {} } class Composed extends Template<int>, Template<double> { }; Composed composed; composed.function(3); //calls function(int) composed.function(2.5); //calls function(double) 从维基列表http://en.wikipedia.org/wiki/Multiple_inheritance#Implementations我试图用下面的编程语言编写代码(我还包括最新的尚未发布的1.0版本(2013年)的语言,如Kotlin,锡兰): C ++几乎可能,但不能解决组合变量的重载函数 Scala编译错误:特征继承两次; 即使被间接继承欺骗,它仍然会产生错误; 另请参阅其他人在Scala中关于多个泛型混合继承的问题 埃菲尔编译错误:没有函数重载 锡兰特征不能有变量(也没有保护成员,所以没有把数据存储在派生类中的技巧,锡兰特征是无用的) Fantom没有泛型/模板 Kotlin编译错误:超类型出现两次; 代表团看起来是独一无二的,但没有用处,因为可以既不访问受保护的成员,也不访问委派的变量 铁锈无功能重载; 性状不能存储数据; 特征不能有定义的方法(与身体) – 正在处理的问题; OCaml编译错误:没有函数重载; 它也没有检查我的函数的参数类型,所以如何“静态类型”它真的是? 卷曲编译错误:没有函数重载; 它也不检查函数体,除非被调用,那么“静态类型”是如何呢? 是根本编译还是解释? Gosu是一个不好的笑话,它根本不可用:不能用一个方法编写和实现简单的接口(错误:ClassFormatError:非法字段修饰符)。 谁实际上使用这种语言? 顺便说一句:我想这个问题,当我试图把听众的Java支持到单独的类(在许多类中有:List <ListenerType> … […]

桥梁设计模式造成了太多的泛型

我目前正在为Minecraft开发一些东西,而且我正在使用桥接模式,所以我的代码可以和两个独立的服务器平台(Sponge和Bukkit)一起使用,但是它们有不同的API(但有点相似)。 我有我的核心代码,这只取决于我后面需要的Minecraft中常见的东西的抽象,比如玩家和物品,以及抽象工厂和建造者类。 特定服务器平台的代码将实现工厂和构建器,并将它们作为依赖关系提供给核心代码。 到目前为止,这一直工作得很好,但我遇到了一个相互依赖的抽象问题。 例如,我有适用于Minecraft库存的适配器,以及从服务器平台的物料/库存类型到我自己的抽象物料/库存类型的物料。 Item和Inventory对象需要互相交互,由于核心代码并不知道实现,所以我使用泛型。 这是一些伪代码: interface Item<TBase> { TBase getBase(); } interface Inventory<TItem extends Item<*>> { void addItem(TItem item); } Item类适应服务器平台使用的项目类型中的项目。 addItem()方法实现将使用getBase()方法将服务器平台的项目实例添加到服务器平台的清单实例中。 总体而言,泛型提供了平台特定对象之间交互的解决方案。 但是,我遇到的问题是随着项目规模的扩大,泛型变得越来越复杂。 原因之一是使用物品/库存的类将需要相同的泛型。 例如,所有玩家都有一个清单: interface Player<TItem extends Item<*>> { Inventory<TItem> getInventory(); void giveItem(TItem item); } 而使用玩家的东西需要泛型,等等。 第二个问题是实例之间有更多的交互,而不仅仅是这两个实例之间的交互,这可能意味着一个对象的几个通用参数,因此所有使用该对象的类都具有更多的泛型。 我想另一个解决方案根本就不会使用泛型,改变getBase()返回一个Object类型,并盲目地转换,相信它是正确的类型(它将是)。 我已经仔细考虑了这一点,这是我能想到的最好的。 我想知道是否有其他解决方案,我错过了,或任何设计模式,可能有助于解决这个问题。 如果有源可以帮助,你可以在这里找到它: https : //github.com/BenWoodworth/FastCraft/tree/master/src/main/kotlin/net/benwoodworth/fastcraft

如何使用kotlin创建在构造函数中传递方法引用的泛型类的实例

现在,我正在使用kotlin作为我的主要编程语言,我正试图简化Android的Recyclerview实现逻辑,我被困在以下几点: 比方说,我已经定义了下面的ViewHolder类,通过构造函数中的方法引用传播点击位置事件。 class CustomViewHolder(itemView: View, val onClick: (Int) -> Unit)) : RecyclerView.ViewHolder(itemView){ itemView.setOnClickListener { onClick.invoke(adapterPosition) } } 我怎样才能构建一个在构造函数中有一个方法引用的泛型类的实例? 我的recyclerview实现在构造函数中有一个泛型类,也是一个实体引用,可以通过在onCreateViewHolder上的反射来创建我的CustomViewHolder类的实例: class CustomAdapter<HolderClassGeneric>(val entityClass: Class<HolderClassGeneric>) : RecyclerView.Adapter<HolderClassGeneric>() { /* Usual recyclerview stuff */ //Method that I want to be called when a list item is clicked fun onListItemClicked(position: Int) { //do stuff } override fun onCreateViewHolder(parent: ViewGroup, […]

谷歌Gson – 反序列化列表<class>对象? (通用型)

我想通过谷歌Gson传递一个列表对象,但我不知道如何反序列化泛型类型。 我看了这个 (BalusC的回答)之后试了一下: MyClass mc = new Gson().fromJson(result, new List<MyClass>(){}.getClass()); 但是后来我在eclipse中得到一个错误:“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复,我会得到一个超过20个方法存根的怪物。 我很确定有一个更简单的解决方案,但我似乎无法找到它! 编辑: 我现在有 Type listType = new TypeToken<List<MyClass>>() { }.getType(); MyClass mc = new Gson().fromJson(result, listType); 不过,我在“fromJson”一行中得到以下例外: java.lang.NullPointerException at org.apache.harmony.luni.lang.reflect.ListOfTypes.length(ListOfTypes.java:47) at org.apache.harmony.luni.lang.reflect.ImplForType.toString(ImplForType.java:83) at java.lang.StringBuilder.append(StringBuilder.java:203) at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:56) at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:88) at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:76) at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:106) at com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:64) at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:49) at com.google.gson.Gson.fromJson(Gson.java:568) at com.google.gson.Gson.fromJson(Gson.java:515) at com.google.gson.Gson.fromJson(Gson.java:484) at com.google.gson.Gson.fromJson(Gson.java:434) […]

Java类型作为GSON的参数

在GSON中获取你所做的对象列表 Gson gson = new Gson(); Type token = new TypeToken<List<MyType>>(){}.getType(); return gson.fromJson(json, token); 它工作的很好,但我想走得更远,并有MyType参数化,所以我可以有一个共同的功能来解析与此代码的对象的列表 // the common function public <T> List<T> fromJSonList(String json, Class<T> type) { Gson gson = new Gson(); Type collectionType = new TypeToken<List<T>>(){}.getType(); return gson.fromJson(json, collectionType); } // the call List<MyType> myTypes = parser.fromJSonList(jsonString, MyType.class); 可悲的是返回一个StringMaps数组,而不是类型。 T被解释为另一种泛型,而不是我的类型。 任何解决方法?

T中的T(泛型)实例

简而言之:为什么我不能在Java中编写下面的代码? public class Foo<T> { public void foo(Object bar) { if (bar instanceof T) { // todo } } } 是的,我知道,泛型有点侵入Java。 泛型不在Java 1.5之前,泛型在运行时会丢失。 我也知道,它有一些模式。 例如: public class Foo<T> { Class<T> clazz; public Foo(Class<T> clazz) { this.clazz = clazz; } public void foo(Object bar) { if (clazz.isInstance(bar)) { // todo } } } 我的问题是,为什么不是编译器自动完成的? 对于每个具有泛型类型的类,编译器可以为每个构造函数自动添加一个(如果我有更多的泛型类型)参数,并将这些值绑定到私有字段。 而每一次,我写的bar […]

标准的二进制maxBy函数

我概括了下面的代码: fun max(that: Type): Type = if (this.rank() < that.rank()) that else this 对此: fun max(that: Type): Type = maxBy(this, that) { it.rank() } fun maxBy<T, U : Comparable<U>>(a: T, b: T, f: (T) -> U): T = if (f(a) < f(b)) b else a 在Kotlin的标准库中是否有像maxBy这样的函数? 我只能找到一个数组。

类型擦除如何工作

我正在研究如何创建代理对象的库,特别是我想了解如何从声明的方法获取类型。 例如Android的流行库 – Retrofit: interface MyService { @GET("path") Call<MyData> getData(); } 我很困惑 – 如何从这个接口完全得到MyData类不是原始对象? 因为我的理解类型删除将删除放置在通用括号内的任何信息。 我写了一些测试代码,令人惊讶的是从这样的代码中获取类型真的很容易: @org.junit.Test public void run() { Method[] methods = Test.class.getDeclaredMethods(); Method testMethod = methods[0]; System.out.println(testMethod.getReturnType()); ParameterizedType genericType = ((ParameterizedType) testMethod.getGenericReturnType()); Class<Integer> clazz = (Class<Integer>) genericType.getActualTypeArguments()[0]; System.out.println(clazz); } interface Test { List<Integer> test(); } 它看起来有点肮脏,但它的工作原理和打印Integer 。 这意味着我们在运行时有类型。 另外我读过关于匿名类的另一个诡计: System.out.println(new ArrayList<Integer>().getClass().getGenericSuperclass()); 打印原始的AbstractList<E>而这个代码 […]