我发现最近对Kotlin作为一种语言的兴趣,因为我们开发的平台是基于Java 6的,因此缺乏近年来给Java带来的任何语法糖.
只有一件事使得在开发中不可能使用Kotlin而不是Java,也就是说,我们开发的平台在内部使用一些反射并要求成员公开.否则它将不起作用.
因此,从Kotlin文件生成的字节码实际上产生了公共getter和setter,这些字段本身仍然是私有的.
有没有办法克服这个问题,所以我得到了真正的公共领域?
我知道需要公共领域的设计失败,但系统对我们来说是一个黑盒子,我们不能改变它必须这样的事实.
我有一组(用户)组和一个表格,我显示这些组(和用户).每个组表头包括f:selectOneMenu允许设置组范围值的a.为了这个例子,让它是一个int值列表(0,5,10,15,20).下面的简短版本的东西
的POJO:
public class User {
private int id;
private String name;
// .. getter, setter, equals, hashCode
}
public class Group {
private int id;
private String name;
// .. getter, setter, equals, hashCode
}
Run Code Online (Sandbox Code Playgroud)
豆:
@ManagedBean(name = "oneSelectController")
@ViewScoped
public class OneSelectController implements Serializable {
private List<User> users;
private List<Group> groups;
private List<Integer> values;
private Map<Group, List<User>> usersToGroup;
private Map<Group, List<Integer>> valuesToGroup;
public OneSelectController() {
log.info("New " + this.getClass().getSimpleName() + " ...");
users = new ArrayList<>(4); …Run Code Online (Sandbox Code Playgroud) 我有:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
Run Code Online (Sandbox Code Playgroud)
然而我宣布:
public enum DirectoryWatchService {
INSTANCE;
private java.util.Optional<String> test;
private java.nio.file.Files files;
}
Run Code Online (Sandbox Code Playgroud)
Eclipse没有打扰.IntelliJ也不是.即使是Maven也不会打扰.我甚至可以做一个mvn清洁包.在没有任何警告的情况下构建糟糕的东西.
我有一个像下面这样的抽象类:
abstract class AbstractSync<out C : Configuration<*>> : ISync {
internal abstract val configuration: C
...
}
Run Code Online (Sandbox Code Playgroud)
我想要另一个继承自此的抽象类:
abstract class CascadedSync : AbstractSync {}
Run Code Online (Sandbox Code Playgroud)
CascadedSync类不应该修改泛型参数C,实际上它应该只实现一个ISync方法而不是其他方法.
我正在尝试不同的语法来实现这个看似简单的任务.在Java中,这看起来像这样:
abstract class CascadedSync extends AbstractSync {
}
Run Code Online (Sandbox Code Playgroud)
在IntelliJ的帮助下将其翻译成Kotlin会产生以下结果:
abstract class CascadedSync : AbstractSync<*>()
Run Code Online (Sandbox Code Playgroud)
但同时给出以下错误:
对于超类型的直接子类型,不允许进行投影
什么是正确的语法?
我想知道以下是否有效:
class SomeCalc {
AtomicLong someResultA;
AtomicDouble someResultB;
public SomeCalc(List<Something> someList) {
final Stream<Something> someStream = someList.stream();
new Thread(() -> {
long result = someStream.mapToLong(something -> something.getSomeLong()).sum();
someResultA.set(result);
}).start();
new Thread(() -> {
double result = someStream.mapToDouble(something -> (double) something.getSomeLong() / something.getAnotherLong()).sum();
someResultB.set(result);
}).start();
}
}
Run Code Online (Sandbox Code Playgroud)
只要结果如本例中的原子那样,这会很好吗?或者在此过程中是否会有任何ConcurrentAccessModification例外情况或其他问题会出错?
我看到 Zoho API 为我们提供了获取各种用户信息的选项,但我找不到任何方法来获取有关当前发出请求的用户的信息。
OAuth2 安全 API 通常提供这样的端点,就像Google或Twitter一样。
在他们的文档中有一些看起来像这样的东西:
https://www.zohoapis.com/crm/v2/users?type= CurrentUser
但随后他们的解释让所有希望破灭了: CurrentUser - To get the list of current CRM users
有什么已知的方法可以实现这一点吗?
我无法理解Kotlin实际上在做什么:
我的单元测试看起来像这样:
@Test
fun testReadCursorRequest() {
val xml = fromFile()
val parser: ReadCursorRequestParser = ReadCursorRequestParser(xml)
assertEquals(0, parser.status)
assertEquals(134, parser.contacts!!.size)
}
Run Code Online (Sandbox Code Playgroud)
我的解析器看起来像这样
abstract class EnvelopeParser(val xml: String) {
abstract fun parseResponse(response: Element)
init {
parseResponse(xmlFromString(xml))
}
// non-related stuff
}
Run Code Online (Sandbox Code Playgroud)
class ReadCursorRequestParser(xml: String) : EnvelopeParser(xml) {
var contacts: List<AddressBookElementParser> = mutableListOf()
override fun parseResponse(response: Element) {
// here some parsing stuff, fills the contacts-list
println("size is: ${contacts.size}")
}
}
Run Code Online (Sandbox Code Playgroud)
println说size is: 134,单元测试说:java.lang.AssertionError: Expected <134>, actual <0>.
为什么?